在八度我得到
1 - 0.05 -0.95 = 0
and
1 - 0.95 -0.05 = 4.1633e-17
据我所知,这是由求值顺序与近似二进制表示相结合引起的
0.05 为 0.00(0011)
和
0.95 为 0.11(1100)
有人可以给我整个故事或给我一个解释它的链接吗?
- -编辑:
这个问题不是重复的为什么 MATLAB 中的 24.0000 不等于 24.0000?,被其他人识别为可能的重复项。后者处理数字的舍入表示。前者询问计算的执行顺序影响结果精度的机制的细节。
Matzeri 的浮点算术权威资源链接确实是这个问题的明确答案。但是,为了完成:
octave:34> fprintf("%.80f\n%.80f\n", 0.95, 1 - 0.05)
0.94999999999999995559107901499373838305473327636718750000000000000000000000000000
0.94999999999999995559107901499373838305473327636718750000000000000000000000000000
octave:35> fprintf("%.80f\n%.80f\n", 0.05, 1 - 0.95)
0.05000000000000000277555756156289135105907917022705078125000000000000000000000000
0.05000000000000004440892098500626161694526672363281250000000000000000000000000000
换句话说,0.95 不太容易用浮点精确表示,因此第一步中涉及 0.95(无论作为输入还是作为输出)的任何计算都必然不如仅使用 0.05 的计算精确。
所以:
1 - 0.05 = 0.95 (imprecise, due to intrinsic floating-point representation)
(1 - 0.05) - 0.95 = exactly 0 (since both are represented identically imprecisely)
vs
1 - 0.95 = imprecise 0.05 (due to involvement of 0.95 in calculation)
(imprecise 0.05) - (precise 0.05) = not exactly 0 (due to difference in precisions)
HOWEVER。应该指出的是,这种精度差异远低于机器公差(由eps
-- 我的机器上是 2.2204e-16)。因此,对于所有实际应用,4.1633e-17is0. 如果这里的实际点是测试计算结果是否为有效地0,那么实际上,在处理浮点计算时应该始终考虑机器精度,或者最好找到一种方法来重新表述您的问题,以便完全避免相等测试的需要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)