提问人:InsultedByMathematics 提问时间:9/12/2023 最后编辑:InsultedByMathematics 更新时间:9/13/2023 访问量:73
浮点运算中的 x(1/x) = 1 什么时候?
When is x(1/x) = 1 in floating point arithmetic?
问:
我知道在浮点运算中,由于舍入误差,x(1/x) 可能不正好是 1。发生这种情况的最小正整数应为 x=49。
我以为如果 1/x 可以用浮点运算精确表示,x(1/x) 会正好是 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
根据舍入模式,回答它确实以何种比例取消会很有趣 - 在单精度浮点数的情况下,可以通过直接实验来计算......
评论
1/x
x
1<=x<2
1/x
(1/x+error)*x = 1 + error*x
error * x
epsilon
x
x<1.5