假设采用严格的IEEE 754(无多余精度)并四舍五入到最接近的偶数模式,3*x+x
是否总是== 4*x
(因此在没有溢出的情况下精确),为什么?
我无法展示一个反例,因此我对每种可能的尾随位模式abc
和舍入情况进行了冗长的讨论,但我觉得我可能会错过一个情况,也错过了一个更简单的演示...
我也有一个直觉,可以将其扩展到(2^n-1) x + x == 2^n x
,并且在这种情况下测试尾随位的每种组合都是不可行的。
只要n (2^n - 1) x == 2^n x - x,但是y-x+x == y
通常不是真的。
最佳答案
在下面,code format
中显示的数学是使用IEEE 754在最近舍入模式下计算的,并且非代码格式的数学是准确的。
令p为有效位数。
令f为正整数n的因子2n-1,并且可以精确表示(n≤p)。
令U(x)为x的ULP。对于正常值,U(x)≤21-px。
设为f*x
。如果f*x
是次正规的,则它恰好是fx。如果正常,则对于某些| e |,t = fx + e。 ≤½U(fx)≤2像素注意,如果| e |恰好是ULP的一半,则它必须等于所设置的x的最低位(因为否则e会设置一个以上的位,并且不能为ULP的一半)。
代入f,t =(2n-1)x + e。
t + x =(2n-1)x + e + x = 2nx + e。
考虑t+x
。根据IEEE-754舍入取整法的要求,该值必须在t + x的ULP的½之内,我们知道这是2nx + e。显然2nx是可表示的(除非有溢出),并且| e | ≤½U(fx)≤½U(2nx)。因此,除非| e |,否则t+x
必须为2nx。恰好是ULP的一半,x的有效位数的低位是奇数(因为即使是低位也能赢得平局并给出2nx)。
如果n为1,则f为1,e为0。如果2≤n,则| e | ≤1/4 U(2nx)
因此,t+x
必须为2nx。 (溢出和NaN留给读者练习。)
此外,我还针对IEEE-754 32位二进制浮点进行了详尽的测试。