浮点运算中的 x(1/x) = 1 什么时候?

When is x(1/x) = 1 in floating point arithmetic?

提问人:InsultedByMathematics 提问时间:9/12/2023 最后编辑:InsultedByMathematics 更新时间:9/13/2023 访问量:73

问:

我知道在浮点运算中,由于舍入误差,x(1/x) 可能不正好是 1。发生这种情况的最小正整数应为 x=49。

我以为如果 1/x 可以用浮点运算精确表示,x(1/x) 会正好是 1,但我的教授说它实际上比这更微妙,并指出 5 作为例子。我只是想不出还有什么其他原因。有人可以给我一个提示吗?提前致谢!

浮点 IEEE-754

评论

0赞 phuclv 9/12/2023
没有单一的浮点类型和格式。如果你想要 IEEE-754,那么明确地标记它,甚至 IEEE-754 也有许多格式,会产生不同的结果
0赞 InsultedByMathematics 9/12/2023
好的,我的意思是标准的 IEEE-754 双精度。
0赞 Chris Dodd 9/12/2023
是的,如果 1/x 可以精确表示,那么 x*(1/x) 将正好是 1.0。但反之则不然——即使不能精确表示 1/x,x*(1/x) 最终仍可能四舍五入为 1.0。这就是像 5 这样的数字所发生的情况。
1赞 Eric Postpischil 9/12/2023
计算时存在舍入误差(可能为零)。当结果乘以 时,还有另一个舍入误差。有时,四舍五入恰好是相反的方向,它们相互抵消。有时他们没有。1/xx
0赞 chtz 9/12/2023
不完全答案:您可以将问题简化为案例(忽略次正态和非有限案例)。然后检查舍入误差最多可以有多大,计算并查看何时可以大于 。不确定您是否可以轻易地确定哪个实际上会导致错误,但您可以排除很多错误,例如,我认为应该始终四舍五入到正好 1。1<=x<21/x(1/x+error)*x = 1 + error*xerror * xepsilonxx<1.5

答:

3赞 chux - Reinstate Monica 9/13/2023 #1

我认为如果 1/x 可以用浮点运算精确表示,x(1/x) 将正好是 1,

当“1/x 可以精确表示”作为数学等价物时,为 true。

但我的教授说,它实际上比这更微妙,并指出 5 作为一个例子。

5 不符合“如果 1/x 可以精确表示”的标准,因为 1.0/5.0 不完全是 0.2 与公共双精度。尝试:

printf("%.*g\n", DBL_DECIMAL_DIG, 1.0/5.0);

由于舍入误差,可能不完全是 1。

真。还存在范围问题,通常是无穷大。
0.0、Infinity、NAN 是其他通常的嫌疑人
1.0/DBL_TRUE_MIN

...还有什么其他原因......

“计算 1/x 时存在舍入误差(可能为零)。当结果乘以 x 时,还有另一个舍入误差。有时四舍五入恰好是相反的方向,它们 相互抵消。有时他们不会。@Eric Postpischil

评论

0赞 aka.nice 9/13/2023
根据舍入模式,回答它确实以何种比例取消会很有趣 - 在单精度浮点数的情况下,可以通过直接实验来计算......