我知道在浮点运算中,由于舍入误差,x(1/x) 可能不完全为 1。发生这种情况的最小正整数应该是 x=49。
我认为如果 1/x 可以用浮点算术精确表达,那么 x(1/x) 就恰好是 1,但我的教授说它实际上比这更微妙,并指出 5 作为例子。我只是想不出还有什么其他原因。有人可以给我提示吗?预先感谢!
我认为如果 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