数値誤差について
数値計算の過程で発生する誤差の基礎について,簡単にまとめる.
間違っているかも.
小数の表現
プログラムで小数を保持する際には,浮動小数点数で2進数として表す.
浮動小数点数とは,(符号)(仮数部)×2(基数)の(指数部)乗 と表すことである.このように表すことで,桁によらず同じ相対誤差とすることができる.浮動小数点数にすることを正規化と呼ぶ.2進数では,仮数部の最上桁は1で固定であるので,ここにビット(情報)は必要はない.
c++ではfloat(4 bytes,有効数字7桁)ないしは,double(8 bytes)が一般的である.
丸め誤差
コンピュータでは数値が2進数で表されるので,10進数は2進数でメモリ上に置かれる.例えば,0.1(10進数)=0.00011001100110011....(2進数)となる.しかしながら,変数のサイズは有限なので,どこかで打ち切る必要がある.このとき行う0捨1入の操作を丸めると呼び,このとき発生する元の値との誤差が丸め誤差である.
桁落ち
これもそもそも有効桁数が有限であるために発生しているのだろう.二つのほぼ同値である数に対して,小数点の深いところでの差を見ようとすると,そもそも互いに有効桁数のために情報が削減されているところを見ることとなる.その為に,例えば差分をとると,小数点の深いところが殆ど0となり,有効桁数が減少する.これを桁落ちと呼ぶ.
参考URL:
http://technologicaladvance.blog.fc2.com/blog-entry-45.html
情報落ち
大きな数に小さな数を足しても,有効桁数の有限性から数は変化しないという問題.