计算精度

Eli*_*elz 3 floating-point precision matlab floating-accuracy

如果 x 和 y 都可以(精确地)以浮点形式存储在系统中,那么计算精度会是多少。

x - (x/y) * y
Run Code Online (Sandbox Code Playgroud)

aka*_*ice 5

在下溢的情况下,误差可能会很大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
Run Code Online (Sandbox Code Playgroud)

舍入到最近,甚至连 IEEE754 模式,我们有

abs(e) < ulp(x/y)/2
Run Code Online (Sandbox Code Playgroud)

对于除法,这是一个严格的不等式,否则除法必须是精确的。如果它是准确的,我们确信商适合可用有效数(除非除法下溢)。

当我们乘以 y 时,我们得到了这个确切的结果:

x + e*y
Run Code Online (Sandbox Code Playgroud)

我们需要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
Run Code Online (Sandbox Code Playgroud)

y*ulp(x/y)/2 > e*y >= 3*ulp(x)/2不能,所以结果不能是 2 ulp。
演示起来很乏味,所以我的回答仍然可以作为猜测。

最后的减法运算将是精确的 - 请参阅https://en.wikipedia.org/wiki/Sterbenz_lemma

  • 答案很好地解决了渐进和完全下溢的问题。然而“x/y”也可能溢出,导致其他问题。 (2认同)