「でも、ビット数が限られているため、全ての数値を正確に表現するのは難しいんだ。これが、アンダーフローやオーバーフローという現象を引き起こすんだ」と先生は続けました。
「アンダーフローとオーバーフローって何ですか?」とユウコがさらに質問しました。
「アンダーフローは、非常に小さな数値がゼロになってしまう現象だよ。例えば、0.00000001のような数値が、ビット数の限界を超えてしまうと、0として扱われることがあるんだ。一方、オーバーフローは、非常に大きな数値が無限大として扱われる現象だよ。例えば、10の100乗のような数値がビット数の限界を超えると、無限大として扱われることがあるんだ。」
「なるほど、少数を扱うのは難しいんですね。でも、どうして誤差が発生するんですか?」とユウコはさらに興味を持ちました。
「いい質問だね。誤差には丸め誤差、打切り誤差、桁落ち、情報落ちの4種類があるんだ。これらは全て、浮動小数点数を使った計算で生じる問題なんだ」と先生は説明しました。
丸め誤差
「例えば、丸め誤差は、コンピュータが小数点以下の数値を一定の桁数に丸めるときに生じる誤差。別の言い方をすると、表現できる数の範囲である有効桁以降の値を捨てるときに生じる誤差だよ。例えば、3.141592を表示するビット数が限られている場合、3.14や3.142のように切り上げや切り捨てをすることがある。この誤差が丸め誤差だ。」
打切り誤差
「打切り誤差は、計算中に無視される数値が原因で生じる誤差だ。たとえば、長い小数点以下の数値を途中で打ち切ることで、実際の値と少しずれてしまうことがある。例えば1÷3=0.3333333…のような無限に続く長い小数点以下の計算をコンピューターは途中で打ち切るので誤差が生じるんだ。」
桁落ち
「桁落ちは、値がほぼ等しい二つの数値の差を求めた時に起こる。大きな数からほぼ同じ大きさの数を引き算すると、有効桁数が減ってしまい、結果として精度が低下することがあるんだ。例えば、0.157×10^6(10の6乗)ー0.153×10^6=0.004 この場合の有効桁数は1桁になるよね。先ほどの浮動小数点数で表現すると0.400×10^4となるんだけどこの付加された00が元々0だったという保証はないから信用できない桁が増えたことになるんだ。」
情報落ち
「最後に情報落ちは、非常に小さな数が大きな数によって無視されてしまうことだ。例えば、1.0000000001と1を引き算すると、コンピュータではその違いが表現できずに無視されてしまうことがある。」
ユウコは深く理解しました。「なるほど、コンピュータで計算するのは単純じゃないんですね。」
丸め誤差、打切り誤差、桁落ち、情報落ちの定義