数学の具体的な計算にPythonを使って、数学もPythonも同時に学んでしまいましょう。今回はPythonを使って数値計算の桁落ちをみてみたいと思います。動作の確認はJupyterNotebookを用いた場合で行っています。インターフェイスなどの動作環境の違いによって適宜変更点があるかもしれません。
桁落ちの具体例
このような計算で、 が非常に大きな数の場合(ここでは としましょう)計算精度に誤差が生じる場合があります。というのは、 と とがほとんど同じ値になってしまい
import numpy as np s = np.sqrt((10**15)+1) t = np.sqrt(10**15) print('sqrt(X+1) =', s, ': sqrt(X) =', t)
から
その数値的な違いがすでに有効数字と同じオーダーになってしまっていて、計算結果の精度が不明瞭になってしまうためです:
s-t
より
となります。そこで、大きい数同士の差をとることに誤差が生じる危険性があるので、分子を有理化することによって、差をとるという操作をなくしてしまうことができます:
このようにして計算すると
1/(s+t)
より
と計算されます。このようにすると、有効数字の桁数を保ったまま計算できます。
具体例:2次方程式
上のような具体例が現実的に起こりうるのは、2次方程式
で、解の公式から
で がじゅうぶん大きな値だった場合です。
たとえば とすると
で、まさに上の例で とした場合になります。