为什么我在使用“==”时得到错误的答案
问题描述:
我不明白的事情发生在我的两台电脑上。我不知道为什么发生这种情况:为什么我在使用“==”时得到错误的答案
如果I型:
x<-seq(0,20,.05)
x[30]
x[30]==1.45
是否有人有一个单一的线索,为什么我获得的最后一行代码一个假?我的另一台电脑上也发生了同样的事情。我在这里做错了什么?
感谢您的帮助
答
这个问题已经被提出了一百万次,尽管形式不同。这是由于floating point inaccuracy。还有关于浮点错误的here's another link,您可能需要赶上!
试试这个先看看这是怎么回事:
x <- seq(0, 20, 0.5)
sprintf("%.20f", x[30]) # convert value to string with 20 decimal places
# [1] "14.50000000000000000000"
x[30] == 14.5
# [1] TRUE
一切都很好,至今。现在试试这个:
x <- seq(0, 20, 0.05)
sprintf("%.20f", x[30]) # convert value to string with 20 decimal places
# [1] "1.45000000000000017764"
x[30] == 1.45
# [1] FALSE
你可以看到,该机能够准确代表这个数字只能达到一定的数字。这里,最多15位数字左右。所以,通过直接比较结果,你当然会得到一个FALSE。相反,你可以做的是使用all.equal
,它具有公差的参数,其等于.Machine$double.eps^0.5
。在我的机器上,它的计算结果为1.490116e-08
。这意味着如果x[30]
和1.45...
之间的绝对差值为<此阈值,则all.equal
将其评估为TRUE。
all.equal(x[30], 1.45)
[1] TRUE
这样做的另一种方法是明确检查一个特定的阈值(作为@ eddi的答案显示它)。希望这可以帮助。
答
这是与事实做,这些都是double
的,并比较double
的正确方式“在任何语言s是做水木清华这样的:
abs(x[30] - 1.45) < 1e-8 # or whatever precision you think is appropriate
**************** – Simon 2013-05-01 19:29:08
x [30]是'14.5'而不是'1.45'。我向下投票,但我认为你应该删除这个问题。 – Arun 2013-05-01 19:30:58
是的,我在我现在纠正的问题中犯了一个错字。您应该阅读x Simon 2013-05-01 19:32:22