根据this very elaborate answer,我估算下列计算的最大相对误差δ res,max :
// Pseudo code
float a, b, c; // Prefilled IEEE 754 floats with double precision
res = a / b * c;
res = a *(1 +δ a )/(b *(1 +δ b ))*(1 +δ a / b < / sub>)* c *(1 +δ c )*(1 +δ a / b * c )
= a / b * c *(1 +δ a )/(1 +δ b )*(1 +δ a / b )*(1 +δ c )*(1 +δ a / b * c )
= a / b * c *(1 +δ res )
=&GT; δ res =(1 +δ a )/(1 +δ b )*(1 +δ a / b )*(1 +δ c )*(1 +δ a / b * c ) - 1
所有δ均在±ε/ 2的范围内,其中ε为2 ^ -52。
=&GT; δ res,max =(1 +ε/ 2)^ 4 /(1 - ε/ 2) - 1≈2.5*ε
这是一种有效的错误估算方法,可用于基本浮点运算的每个组合吗?
PS:
是的,我读过“每个计算机科学家应该知道的关于浮点算术的内容”。 ;)
答案 0 :(得分:1)
嗯,可能是一种有效的方法。我不确定你是如何驾驭最后一行的,但你的结论基本上是正确的(尽管注意到,因为理论误差可能超过2.5e,实际上误差界限是3e)。
是的,这是一种有效的方法,适用于此表单的任何浮点表达式。但是,结果并不总是那么干净。一旦你在混合中加法/减法,而不仅仅是乘法和除法,你通常不能将确切的表达式与错误乘数完全分开。相反,你会看到输入术语和错误术语直接相乘,而不是在这里相对恒定的界限。
作为一个有用的示例,请尝试导出(a+b)-a
的最大相对误差(假设a
和b
是准确的)。