3*x + x总是准确吗?

aka*_*ice 7 floating-point ieee-754

假设严格的IEEE 754(没有多余的精度)和舍入到最接近的偶数模式,3*x+x总是== 4*x(因此确切没有溢出),为什么?

我无法展示一个反例,所以我对每一个可能的尾部位模式abc和圆形情况进行了长时间的讨论,但我觉得我可能错过了一个案例,也错过了一个简单的演示......

我也有一种直觉,可以将其扩展到(2^n-1) x + x == 2^n x并且在这种情况下测试尾随位的每个组合都不是一种选择.

(2^n - 1) x == 2^n x - x只要n <= 54,我们应该具有IEEE 754的属性,但y-x+x == y通常不是真的......

Eri*_*hil 7

在下文中,所示的数学code format是使用IEEE 754以舍入到最接近的模式计算的,而数学不是以代码格式计算的.

p为有效数中的位数.

˚F是因子2 Ñ -1的正整数Ñ并精确表示(Ñp).

设U(x)为x的ULP .对于正常的值,U(X)≤2 1- p X.

Ťf*x.如果f*x是低于正常,则它恰好是fx.如果是正常的,则t = fx + e为某些| e | ≤½U(fx)≤2 - p x.请注意,如果| e | 正好是ULP的一半,那么它必须等于设置的x的最低位(因为否则e将设置多于一位并且不能是ULP的一半).

代入f,t =(2 n -1)x + e.

t + x =(2 n -1)x + e + x = 2 n x + e.

考虑t+x.根据IEEE-754的舍入到最接近的要求,这必须在t + x的 1/2的ULP范围内,我们知道它是2 n x + e.显然,2 n x是可表示的(除了溢出)和| e | ≤½U(fx)≤½U(2 n x).因此t+x必须是2 n x,除非| e | 正好是ULP的一半,x的有效位的低位是奇数(因为偶数低位赢得平局并给出2 n x).

如果Ñ为1,则˚F为1,且Ë是0.如果2≤ Ñ,则| e | ≤1/ 4 U(2 n x)<½U(2 n x).所以|的情况 e | 是ULP的一半,x的低位是奇数不会发生.

因此t+x必须是2 n x.(Overflow和NaN留给读者练习.)

另外,我对IEEE-754 32位二进制浮点进行了详尽的测试.