【问题标题】:Incorrect logical return for simple sequence简单序列的错误逻辑返回
【发布时间】:2011-10-15 14:56:06
【问题描述】:

这是一些基本代码及其输出。除了对包含 1.2 的序列的逻辑测试给出不准确的结果外,我真的无话可说。它适用于许多其他价值。

# Incorrect
> seq(0.5, 1.5, by=0.05) == 1.2
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

# Correct
> seq(0.5, 1.5, by=0.05) == 1.15
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

# Correct
> seq(0.5, 1.5, by=0.05) == 1.25
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

# Correct
> seq(0.5, 1.5, by=0.05) == 1.3
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

我尝试使用以下方法测试所有值,但没有重现错误:

> sapply(seq(0.5, 1.5, by=0.05), function(x){sum(seq(0.5, 1.5, by=0.05) == x)})
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

我使用的是 R 版本 2.13.2 (2011-09-30),平台:x86_64-pc-linux-gnu(64 位)。

【问题讨论】:

  • 这不是错误,这是使用浮点算法来表示数字的结果。您应该使用all.equal 而不是== 来测试是否相等。这个问题已在 SO 上被问过几次 - 我将尝试找到它们并发布链接。
  • 这是我的猜测。但我认为其他值也会出现同样的问题,不是吗?另外,all.equal 在这里不起作用,因为我想找到等于 1.2 的值(我在 which() 中进行了这个测试)。
  • 它也在 R-FAQ 中。您可能想阅读整个文档。从长远来看,它应该可以为您节省一些时间(也许还有一些尴尬)。
  • 您可以使用Vectorize 创建all.equal 的矢量化版本,然后使用which(all.equal.vec(...) == TRUE)

标签: r


【解决方案1】:

您可以通过编写自己的比较函数来复制 all.equal 所做的事情:

is.nearenough=function(x,y,tol=.Machine$double.eps^0.5){
  abs(x-y)<tol
}

然后您可以执行 which(is.nearenough(s,1.2)) 其中 s 是您的序列。您可能需要调整应用程序的容差。

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2018-04-10
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多