计算精度



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

x - (x/y) * y

在下溢的情况下,误差可能与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 up off。
演示起来很繁琐,所以我的答案只能作为猜测。

最后一个减法操作将是精确的-参见https://en.wikipedia.org/wiki/Sterbenz_lemma

最新更新