为什么我在使用“==”时得到错误的答案

为什么我在使用“==”时得到错误的答案

问题描述:

我不明白的事情发生在我的两台电脑上。我不知道为什么发生这种情况:为什么我在使用“==”时得到错误的答案

如果I型:

x<-seq(0,20,.05) 
x[30] 
x[30]==1.45 

是否有人有一个单一的线索,为什么我获得的最后一行代码一个假?我的另一台电脑上也发生了同样的事情。我在这里做错了什么?

感谢您的帮助

+0

**************** – Simon 2013-05-01 19:29:08

+2

x [30]是'14.5'而不是'1.45'。我向下投票,但我认为你应该删除这个问题。 – Arun 2013-05-01 19:30:58

+0

是的,我在我现在纠正的问题中犯了一个错字。您应该阅读x Simon 2013-05-01 19:32:22

这个问题已经被提出了一百万次,尽管形式不同。这是由于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的答案显示它)。希望这可以帮助。

+0

你介意我扩大你的答案吗? – Arun 2013-05-01 19:35:45

+0

@arun,请直接前进 – 2013-05-01 19:36:04

+0

Got it!感谢你们所有人的真正清楚的解释。 – Simon 2013-05-01 19:45:37

这是与事实做,这些都是double的,并比较double的正确方式“在任何语言s是做水木清华这样的:

abs(x[30] - 1.45) < 1e-8 # or whatever precision you think is appropriate