次の計算で数値浮動小数点エラーを減らしたいと思います。
次の形式の方程式があります。
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 などのいくつかの他の方法の 1 つを使用して、エラーのサイズを制限することができました。もし私がオンラインで反復積を行っていたら、ある種の変換技術を使って問題を総和に減らすことができました。
現状では、この特定の問題にアプローチする方法がわかりません。誰かが考えを持っていますか(そしてそれらと一緒に引用されていますか)?
ありがとう!
Higham 1993.「浮動小数点合計の精度」。サイエンティフィック コンピューティングに関する SIAM ジャーナル。
Kahan 1965年。CACM。「10.1145/363707.363723」。
McNamee 2004年。「正確な合計のための方法の比較」。SIGSAMブル。「10.1145/980175.980177」。