我在八度音阶中获得
1 - 0.05 -0.95 = 0
和
1 - 0.95 -0.05 = 4.1633e-17
我了解这是由于评估顺序与的近似二进制表示形式相结合而引起的 0.05作为0.00(0011) 和 0.95为0.11(1100) 有人可以给我讲整个故事还是给我看一个解释它的链接?
---编辑: 这个问题不是Why is 24.0000 not equal to 24.0000 in MATLAB?的重复,其他人认为这是可能的重复。后者处理数字的舍入表示。前者要求提供详细的机制,通过该机制,计算的执行顺序会影响结果的精度。
答案 0 :(得分:3)
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)
如何。应该指出的是,这种精度差异远低于机器公差(由我的机器上的eps
-2.2204e-16返回)。因此,对于所有实际应用,4.1633e-17 为 。如果此处的实际要点是测试计算结果是否有效, 0,实际上,在处理浮点计算时,应该始终考虑机器精度,或者最好找到一种方法来重新构造您的问题,从而完全避免进行相等性测试。
答案 1 :(得分:2)