コンピュータだからこそ間違える【誤差】

誤差


コンピュータは2進数を基にして動作しますが、それゆえに間違えてしまうことが多くあります。そもそも利用できるビット数にも上限があり、限りなく大きな数や小さな数の表現は不可能です。

コンピュータの間違いの多くは人間側のエラーなのですが、コンピュータの原理上どうしても避けられない間違いも存在します。

この記事では、とくにコンピュータの計算間違い、すなわち誤差についてまとめていきます。

桁あふれ誤差


桁あふれ誤差は、計算結果の数値がコンピュータの表現できる範囲を超えることで発生します。ここでは浮動小数点数の形式のひとつであるIEEE754(32ビット、単精度)で考えてみます。

オーバーフロー


IEEE754(32ビット)では2の128乗を表現することはできません。表現できる最大の数は127乗までですから、これを上回ると表現可能な範囲からあふれてしまいます。

指数の大きな数同士を掛け合わせた結果、オーバーフローが起こってしまうわけです。

アンダーフロー


IEEE754(32ビット)では2の-129乗を表現することはできません。表現できる最小の数は-128乗までですから、これを下回ってしまうと表現可能な範囲からあふれてしまうのです。

ちなみにこの場合、「下回る」ので「漏れてしまう」というイメージの方がわかりやすいかもしれませんね。

丸め誤差


丸め誤差は、計算結果を切り捨てたり切り上げたり、四捨五入したりすることで発生します。

省くほど小さな数とはいえ、そもそも本来存在するはずの数です。数を丸めることで誤差が生じることは当たり前でしょう。これはコンピュータでなくても生じる誤差だといえます。

桁落ち誤差


桁落ち誤差は、絶対値がほぼ等しい数値同士をひき算したり、異なる符号同士でたし算をしたりして有効桁数が少なくなることで発生します。

簡単な例で説明すると、

0.226 – 0.221 = 0.005
→ 有効桁「22」がなくなる!


………というわけです(説明の便宜上10進数にしてあります)。この計算で有効桁数が3桁の数同士を引いたことで有効桁数が1桁になってしまいました。こうして桁落ち誤差が生じるわけです。

情報落ち誤差


情報落ち誤差は、極端に大きな数値と極端に小さな数値を足した時に小さな数の方が計算結果に反映されないことで発生します。

$${
 1.234 × 10^{3} + 5.678 × 10^{-3}\\
= 1.234 × 10^{3} + 0.000005678 × 10^{3}\\
= 1.234005678 × 10^{3}      
}$$

仮数部と指数部を踏まえると、結局のところ

$${
1.234 × 10^{3}
}$$

には変わりません。

打ち切り誤差


打ち切り誤差は、無限小数を途中で打ち切ることで発生します。

円周率(3.14159…)2の平方根(√2 = 1.4142…)などを途中で打ち切ることが分かりやすい例だと思います。

これらは小数点以下が無限に続く数ですから、限りあるメモリ空間でこれら数値を扱うにはどこかで打ち切る必要があります。

誤差をどのように扱うか?


10進数でも2進数でも同じことですが、計算する中で誤差をなくすことはできません。

肝心なことは、

・なるべく誤差が生じないように工夫すること
・どこまでの誤差を許容するかを決めること


です。

コンピュータ人間のように抽象的に物事を捉えられませんし、有限のビットによる具体的な数値しか扱えません。コンピュータであるがゆえのミスも存在するわけです。

それを踏まえてコンピュータの誤差と付き合っていく必要があります。





それでは、今回はここまでといたします。
最後までお読みいただきありがとうございます。


誤差
最新情報をチェックしよう!