【发布时间】:2021-05-10 20:44:21
【问题描述】:
如果 x 和 y 都可以(精确)存储在系统中的浮点数中,计算精度将是多少。
x - (x/y) * y
【问题讨论】:
-
eps(x)可能会让您了解计算错误
标签: matlab floating-point precision floating-accuracy
如果 x 和 y 都可以(精确)存储在系统中的浮点数中,计算精度将是多少。
x - (x/y) * y
【问题讨论】:
eps(x) 可能会让您了解计算错误
标签: matlab floating-point precision floating-accuracy
在下溢的情况下,错误可能与 x 一样大,例如,如果比率 x/y 完全消失并四舍五入为零。
以x=2^-100, y=2^1000为例。
否则,如果 x/y 没有被非规范化(没有下溢),我的猜测是大多数时候你会得到一个完美的零,最多 eps(x) - 即 1 ulp(x)时间,只要 Matlab 引擎遵守 IEEE754 标准。
原因是这个:注意舍入误差e
float(x/y) = x/y + e
通过四舍五入,甚至与 IEEE754 模式相关,我们有
abs(e) < ulp(x/y)/2
对于除法,这是一个严格的不等式,否则除法必须是精确的。如果它是准确的,我们确信商适合可用的有效数字(除非除法下溢)。
当我们乘以 y 时,我们得到这个精确的结果:
x + e*y
我们需要有 e*y >= ulp(x)/2 才能将这个确切的结果四舍五入 x
那是y*ulp(x/y)/2 > e*y >= ulp(x)/2。
这可能发生,例如尝试:
x=2^52+2^51+1 , y=2^52+1 , x - (x/y)*y , y*eps(x/y)/2 > eps(x)/2
但是y*ulp(x/y)/2 > e*y >= 3*ulp(x)/2不能,所以结果不能是2 ulp off。
这演示起来很乏味,所以我的回答仍然是一个猜测。
最后的减法运算将是精确的 - 请参阅https://en.wikipedia.org/wiki/Sterbenz_lemma
【讨论】:
x/y 也可能溢出导致其他问题。