10進数で1÷3をすると、割り切れない数となります。
- 1÷3 = 0.33333333.....
当たり前ですが3進数なら10進数の1/3や2/3は割り切れる数です。※()内は基数
- 1/3 (10) = 0.1 (3)
- 2/3 (10) = 0.2 (3)
2進数の場合においても無限小数はあり、例えば10進数の0.1を2進数にすると無限小数となります。
- 0.1 (10) = 0.0001100110011... (2)
10進数→2進数に変換してみるとたしかに永遠に割り切れません。
- 0.1 x 2 = 0.2
- 0.2 x 2 = 0.4
- 0.4 x 2 = 0.8
- 0.8 x 2 = 1.6
- 0.6 x 2 = 1.2
- 0.2 x 2 = 0.4
- 0.4 x 2 = 0.8
- 0.8 x 2 = 1.6
- 0.6 x 2...
無限小数の数字であってもコンピュータのビット数は決まっているのでその数字に近い数字で表すしかありません。近似値で表すことによって実際の値との誤差が生じます。
誤差の種類には以下のようなパターンがあります。
丸め誤差
上記の無限小数のような数字で、端数を切り捨て・四捨五入・切り上げした場合に起こる誤差です。
例
10進数の0.1を表現したいが、
- 0.00011001100110011...
と無限に続くので、
- 0.000110011
として、それ以降の数字は切り捨てる場合など。切り捨てた部分が実際の数字と誤差が生じます。
打切り誤差
計算を途中で打ち切ることによって生じる誤差です。
10進数でいうところの『円周率』を3.14で表現するようなものです。
例
- 3.14159265....
と、永遠に続くので、
- 3.14
で計算することにする。計算を打ち切った部分が実際の数字と誤差がでます。
桁あふれ誤差
コンピュータが取り扱える最大値や最小値を超えてしまったことにより生じる誤差です。
例
8ビットで、
- 符号1桁、指数部3桁、仮数部4桁
の浮動小数点で表す場合、(10進数で)-128~127までの数字を取り扱えますが、それを超える数字はけたあふれとなり表現できなくなります。
マイナスを超えた場合(今回の場合だと-128より小さい数字)を『アンダーフロー』、プラスを超えた場合(今回の場合だと127より大きい数字)を『オーバーフロー』といいます。
情報落ち
大きな数字と小さな数字の差が大きい数字を加減算したときに、小さい方の数字が反映されない誤差のことを言います。
例
8ビットで、
- 符号1桁、指数部3桁、仮数部4桁
で表す場合で、以下2つの数字を足すとします。
- 0.1111 x 24
- 0.1001 x 2-4
足すので指数を揃えて計算します。
0.111100000000 x 24
+)0.000000001001 x 24
----------------------
0.111100001001 x 24
仮数部は4桁しか表示できないので、正規化すると小さいほうの数字が省略されてしまいます。
- 0.1111 x 24
小さい方の数字が誤差となります。
桁落ち
浮動小数点の演算で絶対値が非常に近い値を減産した場合に生じる誤差です。
例
わかりやすく10進数で解説。√1001 - √1000を計算してみましょう。近似値は以下のとおりです。
- 31.63858403911275
- 31.62277660168379
0.n×指数で表現すると、
- 0.3163858403911275 x 102
- 0.3162277660168379 x 102
有効桁数が4桁の場合
有効桁数が4桁だとすると、
- 0.3163 x 102
- 0.3162 x 102
となり、計算結果は、
- 0.0001 x 102
となります。0.n×指数の形に正規化すると、
- 0.1000 x 105
となりました。4桁以上は計算できないので、0.1以降は0で埋まります。
有効桁数が16桁の場合
有効桁数が16桁の場合、
- 0.3163858403911275 x 102
- 0.3162277660168379 x 102
を減算し、答えは、
- 0.000158074 x 102
となります。0.n×指数の形に正規化すると、
- 0.1580740000000000 x 105
となります。相変わらず0は増えるものの、0.1×105よりはだいぶ正確な計算結果になりました。このように有効桁数が少なくなってしまう誤差を桁落ちといいます。
おわりに
丸め誤差や打ち切り誤差、桁あふれ誤差は理解しやすいものの、桁落ちは一見わかりずらいので注意していきましょう。