小清水さんとコンピューター数学

コンピューター・数学 に関することを書きます (特に丸め誤差の話が多いです。)

Excelでおかしな計算結果になった問題の正解値を求める

小清水 (@curekoshimizu) です。

以前紹介した記事に

math-koshimizu.hatenablog.jp

がありました。この内容はざっくりいいますと

 a=77617, b=33096 の場合の

 \displaystyle 333.75 b^6 + a^2 (11 a^2 b^2 - b^6 - 121 b^4 - 2) +5.5 b^8 + \frac{a}{2b}

の値を Excel で計算すると 1.17260394...

真の解は -0.827396...

であると紹介しました。

正しい結果の計算方法を載せなかったために

正しい結果 を信じてくれない人がいましたので、

その計算方法を載せます。

どうやって計算する?

浮動小数点数で計算したのが間違いです。

この演算の登場したのはすべて 有理数のみ であることから

今回の場合、本当に正確に計算結果を求めたいのであれば

有理数ですべて計算すればいい のです。

当然といえば当然です。

計算してみよう

python有理数ライブラリを使って計算するのが簡単です。

#!/usr/bin/env python

from fractions import Fraction

a = Fraction(77617)
b = Fraction(33096)

ret = Fraction(333.75)* b*b*b*b*b*b + a*a*(Fraction(11) * a*a * b*b -b*b*b*b*b*b -Fraction(121)*b*b*b*b-Fraction(2)) + Fraction(5.5)*b*b*b*b*b*b*b*b + a/(2*b)

print ret
print float(ret)

この計算結果は

-54767/66192
-0.827396059947

なので有理数

 \displaystyle -\frac{54767}{66192} = -0.82739605994\cdots

が正解値なのがわかります。

明らかに 負の数 なのに Excel は正の数 を返してきたわけですが、

これで Excel の計算結果に不安 を感じてもらえたでしょうか?

短い記事でしたが以上です。