この記事は、コンピューターの世界における「誤差」についてまとめたものです。
大体こんなモノがあるという資料にしていただけたら嬉しいです。
Q,そもそも誤差はなぜ生じる?
A,ビットで表現しないといけないコンピューターの都合上、桁数が非常に大きくなる計算(0.333333…みたいな無限小数とか、無限に続く円周率とか)をしようとすると、無限に計算し続けないといけません。
正確性を求めて無限に計算を続けていては、計算が出来ないということである程度の正確さで妥協する仕組みが存在しています。それがコンピューターにおける誤差です。
桁あふれ誤差
与えられたビット数よりも、多くの数を入力しようとした時に、表現しきれなかった数が切り捨てられてしまう誤差。
-桁あふれ誤差の例
電卓で言うと、「99999999*9999999999」のような計算をした際に、液晶モニターに表現しきれなくなる症状がコレに近いです。
なお、桁が大きい方にあふれる事を**「オーバーフロー」、桁が小さい方にあふれることを「アンダーフロー」**と表現します。
丸め誤差
整数で表現する場合、無限に数が続いてしまうものをビット上で表そうとする場合、どこまでもビットを必要としてしまいます。
その時に、ある程度の桁数まで計算して残りを切り捨てる事で生じる誤差を、丸め誤差といいます。
-丸め誤差の例
電卓でいうと、1/3を計算した時なんかが丸め誤差を生じさせる起因になります。
分数を数字に戻した場合、0.33333333333333333333(以下略)といった具合になるはずですが、正確な計算をすればどこまでも「3」が続いてしまいます。
そうさせない為に、ある程度の部分で計算を切り落とす事を、丸め誤差と言います。
飲み会の会計の際に合計金額が6501円だった事を友人に伝える際、「6500円」と表現するでしょう。コレも丸め誤差です。
打ち切り誤差
計算時間があまりにも長い処理になった場合、途中で計算を打ち切られる事によって生じる誤差を、打ち切り誤差といいます。
-打切り誤差の例
たとえば円周率なんかが、打切り誤差の例になります。
3.411592…と、円周率は続きますが正確にやろうとすれば無限に続くため計算が終わらないということになってしまいます。
そうならない為に、終わらない計算は、ある程度の所で計算が打ち切られるのです。
これには、上記の丸め誤差とかぶる部分もあります。
1/3の計算は、3がどこまでも続きますから、丸め誤差として処理されなかったとしても時間のかかりすぎで、打切り誤差として処理されてしまうでしょう。
桁落ち
大きな桁数かつ似ている数字の、差を求めた時に起こる誤差です。
例えば有効数字(表現できる桁数)が、7桁の数を比較するとしましょう。
「0.555555(以下無限に5が続く)」と、「0.555554(以下無限に4が続く)」の差を求めた時に、出てくる結果は、「0.000001」です。
でもよく考えてみてください。
小さい桁の誤差を求める場合、その小さな誤差を精微に測りたいからな場合も出てくるはずです。
でも、上記の有効数字7桁の縛りのせいで、「0.000001」という数字以上の誤差が計算から外されてしまうのです。
-桁落ちの例
桁落ちは僅かな誤差の計算で解る桁数が大幅に下る減少です。
わかりやすく言えば、一般的な定規で、精密機器がやるような誤差判定をするようなものです。
定規ならミリ単位の誤差はわかりますが、マイクロメートルや、ナノメートルの誤差は測れません。それと同じです。
情報落ち
絶対値の大きな数と、絶対値の小さな数を加算したり減算したりすると、絶対値の小さな数がなかった事にされるものです。
有効数字7桁で表現される数字で考えてみましょう。
「1234.567」に対して、「0.000123」を足し合わせた場合、**大きい方から7桁までしか計算せずそれ以下の数字は切り捨てる処理が行われる為、「1234.567」**になります。
大きい数の上位8桁に、小さい数の8桁がかぶらなかったせいで、小さい方の数が全て切り捨てられてしまいました。
-情報落ちの例
追加される数字が、あまりにも小さい為反映されないのが情報落ちです。
1kgのパン粉の塊を、1g単位で測れる秤に載せているとして、そこに「パン粉の粒1粒分」を追加しても、軽すぎて秤に反映されないのに近いです。
まとめ
コンピューターは「無限に続く数」や「桁数の大きな計算」が苦手で、そういった計算を振ると「大体これくらいでしょ?」という数字を出す事がある。