浮動小数点を用いた計算ではどうしても誤差が発生します.この誤差を考慮してプログラムを組まないと思ってもみない計算結果になり事故の原因となります.この記事ではどのような誤差に気をつけなければならないか紹介します.
誤差の種類
誤差の種類 | 説明 |
---|---|
情報落ち | 絶対値の大きな値と絶対値の小さな値を下減産したときに発生し,絶対値の小さな値が結果に反映されない ex) 23400000000 + 0.0000000001 = 23400000000 |
桁落ち | 絶対値がほぼ等しい値の減算を行なったときに発生し,有効桁が減る ex) 0.88888 – 0.88887 = 0.00001 |
丸め誤差 | 計算結果の四捨五入,切り上げ,切り捨てを行なったときに発生する |
打ち切り誤差 | 途中で計算を止めたことで発生する |
オーバーフロー | 計算結果が扱える数の範囲を超えると発生する |
情報落ち
コンピュータは無限の桁数を計算できるわけではなく,限られた桁数までしかあつかうことができません.浮動小数点表現では10進数で7桁(単精度)or14桁(倍精度)までしか扱えません.
情報落ちは桁数に上限がある場合に発生する誤差です.
例を考えます.下記2つの数値の加算の場合で考えます.
$$ 2,550,000,000 = 2.55 \times 10^2 $$
$$ 0.0000001 = 1 \times 10^{-7} $$
上記2つの数値を足すと,
$$ 2,550,000,000 + 0.0000001 = 2550000000.0000001 = 2.5500000000000001 \times 10^9 $$
この数値は16桁あり倍制度を超えているため全ての桁をあつかうことができません.その場合コンピュータは先頭から14桁を有効桁数とし,それ以外を切り捨ててしまいます.
$$ 2.5500000000000001 \times 10^9 = 2.5500000000000 \times 10^9 $$
結果,0.0000001を加えたのにも関わらず計算結果には反映されていない情報落ちが発生します.
桁落ち
桁落ちとは計算した結果有効桁が減少し,数値の取り扱いが大雑把になってしまう現象です.
表の説明の式(0.88888 – 0.88887 = 0.00001)を考えてみます.
数値 | 有効桁(仮数の桁) |
---|---|
\(0.88888 = 8.8888 \times 10^{-1}\) | 5桁 |
\(0.88887 = 8.8887 \times 10^{-1}\) | 5桁 |
\(0.00001 = 1 \times 10^{-6}\) | 1桁 |
計算した結果有効桁数が5桁から1桁になっており,有効桁が落ちています.
有効桁とは簡単に言うと数値の精密さのことです.例えば超高性能な測定器でとある数値を測定したとします.その測定器は小数点以下10桁で測定できます.この測定結果を元にシミュレーションを行ったところ1桁の小数点以下しか出力されなければ,他9桁の精密なデータは意味がなくなります.これが桁落ちの誤差です.
丸め誤差
丸め誤差は,有限の桁数で表現された数値をより少ない桁数に切り詰めることによって生じる誤差のことを指します.これは,計算機が無限の桁数を持つことができないために発生します.
例えば,浮動小数点数を考えてみます.ある計算で得られた結果が,ある桁で切り捨てられるか丸められるかすると,本来の値とは異なる結果が得られることがあります.
$$ a = 1.234567 $$
この数値を3桁に丸める場合(この例では四捨五入)か気になります.
$$ a_{rounded} = 1.23 $$
この結果は,元の値からの誤差を含んでいます.丸め誤差は計算の途中や結果の表示など,さまざまな場面で発生する可能性があります.