浮動小数点数と近似・誤差

現代のコンピュータは十分に大きなサイズのメモリや補助記憶装置を搭載していますが、それでもそれらの容量が有限であることに違いありません。 すなわち、どれだけ高性能なコンピュータでも無理数のような無限に続く数字の列をデータとしてコンピュータに格納することはできず、有限に近似しなければいけません。 コンピュータでの数値計算、特に実数値を扱う場合にはこの近似による影響について理解しておく必要があります。 ここでは、コンピュータで実数を扱う上で用いられる浮動小数点数とそれに関する誤差について学修します。

2 進数による小数の表現

10 進数の実数 は、以下のように級数を用いて 2 進数 として表されました。(

10 進数では有限の桁数で表される実数でも、2 進数では循環小数となり、有限の桁数で表すことができなくなる場合があります。

0 に 0.1 を 10 回足し合わせると、合計値は 1.0 であることが期待されますが、コンピュータ上ではその通りになりません。

JavaScript で以下のプログラムを実行してみましょう。

let s = 0;
for (let i = 0; i < 10; ++i) {
  s += 0.1;
}
console.log(s);

実行結果は以下のようになります。

0.9999999999999999

実行結果は 1.0 ちょうどではなく、誤差が生じています。

0.1 を 10 回ではなく、 を 32 回足してみましょう。

let s = 0;
for (let i = 0; i < 32; ++i) {
  s += 0.03125;
}
console.log(s);

実行結果は以下のようになります。

1

これは、0.03125 が 2 進数でも有限の桁数で表される、すなわち誤差が発生しないためです。

results matching ""

    No results matching ""