2014/02/03(月)ベキ級数演算の解説
みなさんの原稿を見ていると、ベキ級数演算の記述の苦戦が目立ちました。
確かにまとまって書かれた原稿が少なく、困るのも無理もないと思ったので、急いでまとめた資料を作りました。せっかくなので、ここにアップロードしておきます。
psa.pdf
kvライブラリの常微分方程式、数値積分などはこの演算が基礎となっています。書き殴りで完成度はあまり高くないかと思われますが、参考になれば幸いです。
def twosum(a, b) :
x = a + b
tmp = x - a
y = (a - (x - tmp)) + (b - tmp)
return x, y
def split(a) :
tmp = a * (2**27 + 1)
x = tmp - (tmp - a)
y = a - x
return x, y
def twoproduct(a, b) :
x = a * b
a1, a2 = split(a)
b1, b2 = split(b)
y = a2 * b2 - (((x - a1 * b1) - a2 * b1) - a1 * b2)
return x, y
python風に書くとこんな感じ。
a = 6.929001713869936e+236
b = 2.5944475251952003e+71
のケース。x=a*bはオーバーフローしませんが、a1*b1がオーバーフローしてしまい正しくyが計算されません。
a = 3.5630624444874539e+307
b = -1.7976931348623157e+308
のケース。x=a+bはオーバーフローしませんが、中間変数tmpがオーバーフローしてしまい正しくyが計算されません。