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

问题描述 投票:0回答:1

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

我认为如果 1/x 可以用浮点算术精确表达,那么 x(1/x) 就恰好是 1,但我的教授说它实际上比这更微妙,并指出 5 作为例子。我只是想不出还有什么其他原因。有人可以给我提示吗?预先感谢!

floating-point ieee-754
1个回答
0
投票

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

正确,当“1/x 可以精确表达”时。

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

5 不满足“是否可以精确表达 1/x”的标准,因为 1.0/5.0 与常见的 double 不是 精确 0.2。尝试:

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

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

确实如此。还存在范围问题,因为

1.0/DBL_TRUE_MIN
通常是无穷大。

...还有什么原因...

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

© www.soinside.com 2019 - 2024. All rights reserved.