ただ、イマイチ違いを理解していないんですよね・・・
スポンサーリンク
コンピュータで発生する「誤差」とは
コンピュータで小数を扱う方法の一つに「浮動小数点数」があります。
「浮動小数点数」は、符号、指数部、仮数部に分かれており、仮数部で表現できるビット数が決まっています。例えば、上記図のように32ビット形式の浮動小数点数では、仮数部は24ビットです。(IEEE754形式の場合は23ビット)
このように浮動小数点数を使う場合、仮数部で「表現できる数の範囲」が決まっています。限られたビット数で数をあらわすため、仮数部で「表現できる数の範囲」を超えてしまうことがあります。表現できる数の最小値を超えることを「アンダーフロー」、最大値を超えることを「オーバーフロー」といいます。
例えば、2進数「0.0001100110011...」(10進数の0.1) のように割り切れなくて無限に続く小数のことを「無限小数」といいます。
コンピュータはあらかじめ「決められた範囲」で数をあらわします。そのため、無限小数のような数は「決められた範囲」に収まりません。
これらの数をコンピュータであらわす時は「なるべく近い値」を使います。その結果、実際の値と誤差が生じてしまうわけです。
誤差には次のような種類があります。
誤差の種類 | 説明 |
丸め誤差 | 「表現できる数の範囲」(有効桁)を超えてしまった際に有効桁以降を切り捨てることによって発生する誤差。 |
打切り誤差 | コンピュータの計算処理を途中で打ち切ることにより発生する誤差。 |
桁落ち | 値がほぼ等しい数値差を求めた時に発生する誤差。 |
情報落ち | 大きい値と小さい値の数値を和もしくは差を求めた時に発生する誤差。 |
誤差の種類
丸め誤差
丸め誤差とは、コンピュータが「表現できる数の範囲」(有効桁)を超えてしまった際に、「四捨五入」や「切り上げ」「切り捨て」などを行い有効桁以降の値を捨てることにより生じる誤差のことです。
例えば「0.11001100110011001100110011001100...」のような無限小数に対して、「表現できる数の範囲」(有効桁)が24ビットの場合、「0.1100110011001100110011」と有効桁以降の部分を捨てます。
その結果、正しい結果との間に誤差が発生します。この時に発生する誤差が「丸め誤差」です。
スポンサーリンク
打切り誤差
打切り誤差とは、コンピュータの計算処理を途中で打ち切ることにより発生する誤差のことです。
例えば「1 ÷ 3 = 0.33333333333333333333...」のような無限に続く計算を行う場合、コンピュータは途中で計算を打ち切ります。
その結果、正しい結果との間に誤差が発生します。この時に発生する誤差が「打切り誤差」です。
桁落ち
桁落ちとは、値がほぼ等しい数値の差を求めた時に有効数字が大きく減ることによって生じる誤差のことです。
例えば、次のような値がほぼ等しい数値の差を求めてみます。※「表現できる数の範囲」は7桁(説明のため10進数を例にしています)
(1) 値がほぼ等しい値※丸め誤差あり
√999 ≒ 31.60696125 ≒ 0.3160696 × 10^2
√997 ≒ 31.57530680 ≒ 0.3157531 × 10^2
※7桁に収まらない数字は「四捨五入」
(2) ほぼ等しい値の差
(0.3160696 × 10^2) - (0.3157531 × 10^2) = 0.0003165 × 10^2
(3) 正規化
0.3165000 × 10^-1
値がほぼ等しい有効数字が7桁の値の差を求めた結果、有効数字が4桁に減っています。
そして、浮動小数点数なので正規化され、仮数部が7桁になるように不足している部分を0で埋めます。この時、付与された「0」は正しい値であるかの保証がないのです。
その結果、正しい結果との間に誤差が発生します。この時に発生する誤差が「桁落ち」です。
ためしに元データの差を求めると
31.60696125 - 31.57530680 = 0.03165445
答えは「0.03165445」です。やはり「0」は正しい値ではありませんでした。
桁落ちによって「0.3165000 × 10^-1」となりましたが、本来であれば「0.3165445 × 10^-1」が正しい値です。※赤字の部分が桁落ちにより発生した誤差
情報落ち
情報落ちとは、大きな値と小さい値の加減算を行った際に、小さい値の情報が無視されてしまうことによって生じる誤差のことです。
例えば、次のような値の和を求めてみます。※「表現できる数の範囲」は4桁(説明のため10進数を例にしています)
(1) 大きな値と小さい値
0.1234 × 10^2
0.1234 × 10^-2
(2) 大きい値と小さい値の和
0.1234 × 10^2 + 0.00001234 × 10^2 = 0.12341234 × 10^2
(3) 正規化
0.1234 × 10^2
「表現できる数の範囲」(有効桁数)は4桁なので、正規化すると「0.1234 × 10^2」となり、小さい数である「0.00001234」はなかったことになっています。
その結果、正しい結果との間に誤差が発生します。この時に発生する誤差が「情報落ち」です。