2014/03/19(水)kv-0.4.2
ddでのDBL_MAX/3はちゃんと計算できるようになりました。
他にも、区間演算での無限大の扱いとか、方向付き丸めのエミュレートあたりの完成度が上がっています。
問題がありましたら遠慮なくご意見お願いします。
Rump先生にこのページ知られちゃったので、ドキュメントの英語化をしたくなってきた。が、手間かかるなあ。
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, ypython風に書くとこんな感じ。
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が計算されません。