##「情報落ち」とは
絶対値の大きな値と小さな値の加減算(足し算と引き算)を行った際に、絶対値の小さな値が結果に反映されないことによって生じる誤差のことです。
「情報落ち」を理解するため、絶対値の大きな値と小さな値を用意したいと思います。
また、この2つの数を加算した数を、4ビットの仮数部がある浮動小数点数で表現するとします。
まず、絶対値の小さな値「$0.00001101$」を用意して、指数表現にします。
この数を仮数が「$0.M$($M$は小数点以下の有効な桁)」という形の指数表現にすると、
「$0.1101\times2^{-4}$」になります。
次に、絶対値の大きな値「$1101$」を用意して、指数表現にします。
この数を仮数が「$0.M$($M$は小数点以下の有効な桁)」という形の指数表現にすると、
「$0.1101\times2^4$」になります。
この2つの数を指数を$2^4$に調整して加算すると、次のようになります。
加算した結果、「$0.110100001101\times2^4$」という数になります。
そして、この数を仮数部が4ビットの形式の浮動小数点数にします。
この形式に合わせて「$0.110100001101\times2^4$」を正規化すると、小数点以下の4桁を仮数部に格納するので「$0.1101\times2^4$」になります。
この数は絶対値の大きな数と小さな数を足した数ですが、正規化によって有効な桁が含まれず、実質的に加算されなかったことにされてしまいました。
そのため、加算したはずなのに数が反映されていないという問題が発生します。
##打ち切り誤差
計算処理を完了まで待たずに途中で打ち切ることによって生じる誤差のことです。
あらかじめ計算に条件を設けておき、条件を満たしたら途中で打ち切ることになります。
その結果、完全な結果を得ることが出来ずに誤差が生じます。
たとえば、「小数点以下20桁まで値を求めたらその時点で計算を打ち切る」という条件を設定しておくとします。
この条件のもと、円周率を求めると、次のようになります。
\pi=3.14159 26535 89793 23846
コンピュータが円周率の小数点以下20桁目の「$6$」を求めた時点で計算が打ち切られます。
円周率は延々と続く数ですが、そのうちの一部を切り取った結果になるわけです。
##桁落ち
絶対値がほぼ等しい数値同士の差を求めた時に、有効な桁が大きく減ってしまうことによって生じる誤差のことです。
「桁落ち」を理解するため、絶対値の大きな値「$1.1111$」と小さな値「$1.1110$」を用意したいと思います。また、この2つの数を減算した数を、4ビットの仮数部がある浮動小数点数で表現するとします。
絶対値の大きな値「$1.1111$」から小さな値「$1.1110$」を減算すると、「$0.0001$」という数になります。
大きな値と小さな値はともに有効な桁を5桁持っていたわけですが、減算によって「$0.0001$」の有効な桁は最後の1桁の「$1$」のみになってしまいました。
ここから「$0.0001$」を4ビットの仮数部がある浮動小数点数で表現するため、「$0.M$($M$は小数点以下の有効な桁)」という形で正規化します。すると「$0.1000\times2^{-3}$」という表現になります。
ここで、減算直後の数「$0.0001$」と正規化された「$0.1000\times2^{-3}$」を比較してみます。
減算直後の数は最後の1桁の「$1$」のみが有効な数でしたが、正規化によってその後に「$0$」が3つ加えられた仮数「$0.1000$」になっています。この3つの「$0$」は正規化という都合によって加えられた数であり、数学的に正しい数であるという保証がありません。
したがって、この数を用いて計算を行うと誤差が生じてしまい、期待していた結果にならない場合があります。
##丸め誤差
表現できる桁数を超えてしまったことにより、最小桁よりも小さい部分を四捨五入したり、切り捨てたりして生じた誤差のことです。
たとえば、円周率を小数点以下20桁で求める際に、21桁目を四捨五入して表現するとします。
円周率を21桁目まで表示すると次のようになります。
\pi=3.14159 26535 89793 23846 2
ここで、21桁目の数は「$2$」なので四捨五入すると20桁目の「$6$」で終わります。
円周率は延々と続く数ですが、四捨五入されたことでそれ以降の桁の分誤差が生じることになります。
##参考にさせて頂いた書籍
きたみりゅうじ 『キタミ式イラストIT塾 基本情報技術者平成31/01年』 技術評論社 2019年
##学習してみて
今回で「誤差」についての学習が終わりました。
コンピュータの計算の精度を確保するには今回学んだような誤差への対策が欠かせないわけですが、浮動小数点数のように形式化すればするほどそこから零れ落ちる例外が生まれやすくなるということもあると思います。
おそらく今後自分もこういった誤差に悩まされるような日が来るのかもしれません。
他人事とは言ってられませんね…