Math 串联浮点运算的最大相对误差估计

Math 串联浮点运算的最大相对误差估计,math,floating-point,Math,Floating Point,根据下面的计算,我将估计最大相对误差δ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)*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

根据下面的计算,我将估计最大相对误差δ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)*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)

=>δres=(1+δa)/(1+δb)*(1+δa/b)*(1+δc)*(1+δa/b*c)-1

所有δs都在±ε/2的范围内,其中ε为2^-52

=>δres,max=(1+ε/2)^4/(1-ε/2)-1≈ 2.5*ε

这是一种有效的错误估计方法,可以用于基本浮点运算的每一种组合吗

附言:

是的,我读过“每一位计算机科学家都应该知道的浮点运算”。)

嗯,这可能是一种有效的方法。我不确定你是如何做到这最后一行的,但你的结论基本上是正确的(不过请注意,由于理论误差可能超过2.5e,实际上误差范围是3e)

是的,这是一种有效的方法,适用于这种形式的任何浮点表达式。然而,结果并不总是那么清晰。一旦混合使用了加法/减法,而不仅仅是乘法和除法,通常无法将精确表达式与错误乘法器清晰地分开。相反,您将看到输入项和错误项直接相乘,而不是这里令人愉快的相对恒定的界限


作为一个有用的示例,请尝试推导
(a+b)-a
(假设
a
b
是精确的)。

谢谢您的回答,@sneftel!:)你所说的几乎有效的理论错误是什么意思?关于我的上一个等式:我用上界或下界替换δs,因此δres具有最大的可能值。“几乎有效”是因为,正如我所说,误差可以超过2.5e。顺便说一句,对于除法运算符,使用替代公式fl[a•b]=a•b/(1+δ)通常是有用的,这也是有效的,并且避免了那里发生的奇怪的除法。你介意解释一下吗,δ怎么会超过2.5e?为什么我允许在同一个等式中组合不同的浮点模型?考虑更简单的表达式<代码> FL(FL(A*B)*C)< /代码>。这可计算为
a*b*c*(1+d1)*(1+d2)
,或
a*b*c*(1+d1+d2+d1*d2)
。这个额外的多错误项将错误推到单个d的总和之上。至于你的第二个问题,我不确定你的意思。这是一个浮点模型,有两个不变量,你可以在证明事物时潜在地使用。你可能会发现一篇相关而有趣的论文:克劳德·皮埃尔·詹尼罗德和西格弗里德·拉姆普。“关于浮点运算的相对误差:最佳界限和应用。”(2016)感谢链接@njuffa!真有趣。:)现在我只对安全的错误界限感兴趣。如果必要的话,我的下一步就是收紧它们。