×

tomoロゴ tomo

【高校情報】演算誤差とは?2進数小数のしくみをわかりやすく解説

イリエダ
イリエダ
こんにちは、イルカの妖精イリエダよ。今日はコンピュータの演算誤差についてお話しするわ。

 

コンピュータの演算誤差(えんざんごさ)とは??

コンピュータで計算をすると、正しいはずの計算なのに誤差が出ることがあるの。

例えばこんな現象を見たことはないかしら?

0.1 + 0.2 = 0.30000000000000004

えっ?

0.3じゃないの?

と思うわよね。

 

情報 演算誤差

 

実はこれ、コンピュータのバグではないの。

コンピュータが数を2進数で扱っていることが原因なのよ。

 

このように本来の値とズレが生じることを、

演算誤差(えんざんごさ)

というわ。

 

今回は

  • なぜ演算誤差が起こるのか
  • 2進数の小数表現
  • 0.3が正確に表せない理由

をわかりやすく説明するわね。

 

コンピュータは2進数で数を扱う

私たちが普段使っている数は10進数よね。

例えば

0.875

これは

$$0.875 = 0.5 + 0.25 + 0.125$$

つまり

$$0.875 = \frac{1}{2} + \frac{1}{4} + \frac{1}{8}$$

これを2の累乗で書くと

$$0.875 = 2^{-1} + 2^{-2} + 2^{-3}$$

だから

$$0.875 = 0.111_{(2)}$$

つまり2進数で正確に表せる数ね。

 

小数は2進数で表せないことがある

ところが、すべての小数が2進数で表せるわけではないの。

例えば

0.3

これを2進数にすると

$$0.3_{(10)} = 0.0100110011…$$

のように永遠に続く小数になってしまうわ。

 

これは10進数でいう

1 ÷ 3 = 0.333333...

と同じ現象よ。

つまり2進数では割り切れない数なの。

 

コンピュータは桁数が有限

でもコンピュータの中では桁数は無限にはできない

だからある桁で打ち切る必要があるのよ。

例えば小数点以下8桁までとすると

$$0.01001100_{(2)}$$

のようにするの。

これを

丸め処理

というわ。

 

2進数を10進数に戻してみる

この値を10進数に戻すと

$$0.01001100_{(2)}$$

$$= 0\times2^{-1} + 1\times2^{-2} + 0\times2^{-3} + 0\times2^{-4}$$

$$+1\times2^{-5} + 1\times2^{-6} + 0\times2^{-7} + 0\times2^{-8}$$

計算すると

$$0.296875$$

になる。

 

元の値との誤差

元の値は

0.3

だったわよね。

でもコンピュータの中では

0.296875

として扱われているの。

つまり誤差が生まれているということね。

 

演算を重ねると誤差は広がる

さらに問題なのは、計算を繰り返すと誤差が少しずつ広がることなの。

これを誤差の伝播というわ。

だからコンピュータの計算では

  • 丸め誤差
  • 演算誤差
  • 誤差の蓄積

といった問題が起こるのよ。

 

まとめ

  • コンピュータは数値を2進数で扱う
  • 10進数の小数は2進数で正確に表せないことがある
  • コンピュータは桁数が有限なので丸め処理が起こる
  • その結果、演算誤差が生まれる
  • 計算を繰り返すと誤差が伝播する

 

イリエダ
イリエダ
コンピュータは正確に計算しているのに、数の表し方の違いで誤差が生まれるなんて不思議よね。

 

でもこの仕組みを知っておくと、

  • プログラム
  • AI
  • シミュレーション

などの理解がぐっと深まるの。ぜひ覚えておいてね。

 

それじゃあ!

妖精

ここまで読んでくれてありがとう!おつかれさまでした。

「高校情報Iのまとめページ」で他の記事も復習してみてね。

▶ まとめを見に行く