R中简单计算的负值

时间:2013-11-28 11:17:38

标签: r floating-point floating-accuracy

当我使用R 3.0.1进行简单计算时,得到了以下结果。我的问题是为什么第一个和第三个方程的值不等于0?

> -0.0082 + 0.0632 - 0.055
[1] 6.938894e-18
> -0.0082 - 0.055 + 0.0632
[1] 0
> 0.0632 - 0.0082 - 0.055
[1] 6.938894e-18

1 个答案:

答案 0 :(得分:6)

只有一组有限的实数可以完全表示为64位floating-point值(这就是您正在使用的值)。碰巧的是,您的示例中的三个值都不属于该类别:

> format(0.0082, digits=20)
[1] "0.0082000000000000006911"
> format(0.0632, digits=20)
[1] "0.063200000000000006173"
> format(0.055, digits=20)
[1] "0.055000000000000000278"

这意味着所有计算都不准确。

与您的示例特别相关的是floating-point addition is not associative

要获得出色的背景资料,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic