科学と家事とプログラミング (python を中心に)

python 温度計測 湿度計測 DS18B20 USB9097

桁落ち誤差は、時に牙をむくのです

数値計算には誤差がつきものですが、扱いをあやまると酷い目に会うことになります。 特に桁落ち誤差には注意が必要です。 天文計算の分野で有名な例は、universal kepler 方程式を解く時に出てくる stumpff 関数の計算式でしょうか。例えば、こんな感じ。

 \frac{x-sin(x)}{x^{3}}

見るからに危なそうな形をしていますね。そのまま計算した時の誤差の様子を調べてみましょう。

f:id:sken20k:20180311191455j:plain

横軸は対数にとってあります。 ゼロに近いところの正解は 1/6 のはずですが、x が 1e-7 より小さいところで値が暴れて、 まともに計算できなくなるのが分かります。 「誤差がある」という言葉を聞いたときに想像する誤差の大きさは、分野によっても違うでしょうけど、 大きくても 3割ぐらいを想像する人が多いのではないでしょうか。 桁落ちに代表される計算機の数値誤差は、ときどきデタラメな返として現れるので、注意が必要です。

桁落ちの対処方法はケースバイケースです。上記の場合、x が小さい領域では級数展開に切り替える ような工夫がなされます。例えば、奥村晴彦さんの「C言語によるアルゴリズム」あたりに、 双曲線関数を対象としたチューニング例が出ています。

実際の場面では、元の問題(universal kepler eq.) を解くときに、stumpff 関数の使用そのものを避けるよう な研究(定式化)もあるようです。