Floating point 是3*x+;x总是精确的吗?

Floating point 是3*x+;x总是精确的吗?,floating-point,ieee-754,Floating Point,Ieee 754,假设严格的IEEE 754(无多余精度)并四舍五入到最接近的偶数模式,3*x+x是否总是==4*x(因此在没有溢出的情况下精确),为什么 我无法展示一个反例,所以我对每个可能的尾随位模式abc和舍入情况进行了冗长的讨论,但我觉得我可能错过了一个案例,也错过了一个更简单的演示 我还有一个直觉,这可以扩展到(2^n-1)x+x==2^nx,在这种情况下,测试每个尾随位组合不是一个选项 根据IEEE 754的属性,我们应该有(2^n-1)x==2^n x-x,只要n,在下面的例子中,代码格式中所示的数

假设严格的IEEE 754(无多余精度)并四舍五入到最接近的偶数模式,
3*x+x
是否总是==
4*x
(因此在没有溢出的情况下精确),为什么

我无法展示一个反例,所以我对每个可能的尾随位模式
abc
和舍入情况进行了冗长的讨论,但我觉得我可能错过了一个案例,也错过了一个更简单的演示

我还有一个直觉,这可以扩展到
(2^n-1)x+x==2^nx
,在这种情况下,测试每个尾随位组合不是一个选项


根据IEEE 754的属性,我们应该有
(2^n-1)x==2^n x-x
,只要n,在下面的例子中,
代码格式
中所示的数学是用IEEE 754四舍五入到最近模式计算的,而非代码格式的数学是精确的

设p为有效位中的位数

设f是正整数n的因子2n-1,并且是可精确表示的(n)≤ p)

设U(x)为x的ULP。对于正常值,U(x)≤ 21像素

设t为
f*x
。如果
f*x
低于正常值,那么它就是fx。如果它是正常的,那么对于某些| e | t=fx+e≤ &一半U(外汇)≤ 2-px。请注意,如果| 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(外汇)≤ &一半U(2nx)。因此
t+x
必须是2nx,除非| e |正好是半个ULP,并且x的有效位的低位是奇数(因为偶数低位赢得平局并给出2nx)

如果n是1,那么f是1,e是0。如果2≤ n、 然后| e |≤ 1/4 U(2nx)<一半;U(2nx)。因此,不会出现| e |为半个ULP且x的低位为奇数的情况

因此
t+x
必须是2nx。(溢出和NaN留给读者作为练习。)


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

推测:它是否适用于x为最小值(+和-)到0的情况?对于使用所有位的分数,我怀疑计算是否精确。请记住,4*x将保持分数不变,但3*x可能会丢失一个低阶位。@Rob:在这些情况下,它的作用很小,因为涉及的每个操作都是精确的。“全宽”浮点数更有趣,其中一些中间步骤会产生舍入,但最终结果是准确的。我的证明如下:(短篇故事:关于
3*x
是否与
4*x
处于同一二进制位或与
2*x
处于同一二进制位的案例分析)。在同一个线程中,Stephen提到了对
x
有效位的最后三位进行的案例分析。有趣的是,当计算为
x+x+x
(或
(x+x)+(x+x)
4*x
时,该值也是精确的,但这些都是显而易见的,并不令人惊讶)。因此,计算数量5*x的最合理方法也是精确的,但这并不适用于6*x。@StephenCanon是的,(2^n+1)*x=2^n*x+x我想回答的是,x+x+x+的求和方法不止一种。。。但令人惊讶的是,数量很少,8*x==6*x+2*x==7*x+x