級数の総和を計算することで、 C# で情報落ちを試します。
情報落ち
loss of trailing digits
情報落ちとは、コンピュータで絶対値の大きさが極端に異なる数字を足したり引いたりしたときに、小さい値の情報が無視されてしまう現象。また、そのような現象によって起きる計算の誤差。
情報落ちを回避するには、計算の順序を考える必要があります。
浮動小数点数の計算上、加算・減算では小さな値が大きな数に合わせて表現しなおされますが、このときに小さな値の一部か全部が失われてしまうことがあります。
これを回避するためには、小さい値同士を加えるように処理を変えるという方法があります。
級数の総和計算では比較的わかりやすく結果がわかるため、以下の左辺の計算を、カウントアップ(つまり数が減る方向)と、カウントダウン(つまり数が増える方向)でそれぞれ実行します。これらは手で解析的に計算してみればすべて同じ値( )となります。
今回は float
と double
についてみてみます。 decimal
では誤差の結果は面白くなさそうなので…。ソースコード等はこちらから
16 | static void FloatCheckLoss() |
計算結果は次の通りです。
1 | count up: 0.99985270 |
カウントアップ(つまり数が減る方向)では、解析的な解とは違う値となってしまっています。今回のような計算では式をそのままプログラムにすると誤差が出てしまう場合もあるため、注意が必要です。