浮動小数点数に関係する誤差まとめ
打切り誤差
説明
- PC上で数値を扱うということは、記憶装置(メモリ)に数値を記録させるということ
- 記憶装置は有限個しかないのだから、無限に続く数値(循環小数で表記される有理数や、無理数)を記録させようとすると、どうしても途中で桁を打ち切らなければならない
- この「途中で桁を打ち切る」ことにより発生する誤差を打切り誤差と呼ぶ
例
- 1/3 = 3.3333333... → 3.3333333として記録される(有効桁数が8桁の場合)
- 円周率 = 3.14159265... → 3.1415926として記録される(有効桁数が8桁の場合)
丸め誤差
説明
- 無限に続く数値でなくでも、有効桁数に入りきらなければ、入らない分は削除されてしまう
- その時に、入らない部分を切り捨てるのか、切り上げるのか、四捨五入するのかは、演算装置が決める
- この「入らない分を削除する」ことにより発生する誤差を丸め誤差と呼ぶ
例
- 2.0000001÷2 = 1.00000005 → 1.0000001として記録される(有効桁数が8桁で、9桁目以降は四捨五入する場合)
- 8.9999999 + 1.0000002 = 10.0000001 → 10.000000として記録される(有効桁数が8桁で、9桁目以降は四捨五入する場合)
情報落ち
説明
- 2つの数値同士を演算するとき、2値間の絶対値の大きさ(オーダー)が大きく離れている場合、演算結果の値には絶対値の大きい方の有効桁数が採用される
- その時に、演算結果に丸め誤差が発生したために、演算結果が2値の内の絶対値が大きい方と全く同じになり、絶対値が小さい方の数字がなかったことにされてしまうことがある
- この「絶対値の小さい方の数字がなかったことにされてしまう(=その数値があったという情報が無くなってしまう)」ことにより発生する誤差を情報落ちと呼ぶ
例
- 1.0000001 + 0.00000001 = 1.00000011 → 1.0000001(有効桁数が8桁で、9桁目以降は四捨五入する場合)
- 指数表記を用いれば、1.0000000×10^1+1.0000000×10^-8 → 1.0000000×10^1
桁落ち
説明
- 丸め誤差を持つ2つの数値同士を演算するとき、2値が近い値の場合、演算結果のある桁以降の数字がすべて0になってしまうことがある
- もし、演算した2つの数値の丸められる前の値に対して、同様の演算をした場合、この0になってしまったところは、実は0でなかった可能性がある(本当に0であった可能性もある)
- そうすると、この0になってしまったところについては、本来の数字が分からないため、有効桁から除外され、結果、演算結果の有効桁数は、演算前の2値の有効桁数から減ってしまうことになる
- この「2値が近い値であるために、有効桁数が減ってしまう」ことにより発生する誤差を桁落ちと呼ぶ
例
- √14から10/3を減算するとき(丸める時は切り捨てとする)、
- 有効桁数が8桁だと、3.7416573 - 3.3333333 = 0.40832400となる
- 有効桁数が9桁だと、3.74165738 - 3.33333333 = 0.408324050となる
- 従って、有効桁数が8桁の時の最後の0は、有効桁数が9桁以上の時は5であり、この桁は有効ではない
- 結果、有効桁数が8桁の時の、演算結果の有効桁数は7桁であり、有効桁数が減っている