我想减少以下计算中的数值浮点错误。
我有以下形式的方程:
b_3+w_3*(b_2+w_2*(b_1+w_1*(b_0+w_0)))
其中变量w
表示范围内的某个浮点数[0,1]
,并b
表示范围内的浮点常数[1,~1000000]
。b
随下标单调增加(尽管这可能并不重要)。当然,这可以扩展到任意数量的术语:
b_4+w_4*(c_3+w_3*(b_2+w_2*(b_1+w_1*(b_0+w_0))))
这可以递归定义为:
func(x,n):
if(n==MAX)
return x
else
return func(b[n]+x*w[n],n+1)
func(1,0)
如果我在进行在线求和,我可以使用 Kahan Summation Algorithm (Kahan 1965),或其他几种方法之一,如 Higham 1993 或 McNamee 2004,来限制我的错误大小。如果我在做在线重复产品,我可以使用某种转换技术将问题简化为求和。
事实上,我不确定如何解决这个特定问题。有没有人有想法(和引用与他们一起去)?
谢谢!
Higham 1993。“浮点求和的准确性”。SIAM 科学计算杂志。
Kahan 1965。“实践:关于减少截断错误的进一步评论”。CACM。“10.1145/363707.363723”。
McNamee 2004。“准确求和方法的比较”。SIGSAM 公牛。“10.1145/980175.980177”。