如果x和y在系统中都可以(准确地)以浮点形式存储,那么计算精度是多少?
x - (x/y) * y
在下溢的情况下,误差可能与x
一样大,例如,如果比率x/y
完全消失并四舍五入为零。
以x=2^-100, y=2^1000
为例。
否则,如果x/y没有反规范化(不下流),我的猜测是,你会得到一个完美的零大多数时间,最多eps(x)
-即1 ulp(x)不时,只要Matlab引擎尊重IEEE754标准。
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