数値計算の誤差:打ち切り誤差と丸め誤差 [ネコ騙し数学]
数値計算の誤差:打ち切り誤差と丸め誤差
f(x)は何回でも微分可能な関数とする。
このとき、f(a+h)はx=aにおいて次のようにテーラー展開が可能である。
有限項で打ち切れば、
は剰余項であり、有限項で打ち切ったときの誤差に相当する。
最も簡単なa=0のときを考えてみる。
かりに
という関数があるとする、
だから、これをx=0でテーラー展開(マクローリン展開)すると、
と一致する。
有限な多項式で表される関数ならば、上の例のように第n次以下の導関数を求めることによってその係数を求めることができる。しかし、テーラー展開(マクローリン展開)が指数関数のように、
と無限級数になる場合、これを無限に計算することはできないので、適当な次数nで打ち切って計算をしなければならない。
たとえば、3次の以上の項を落とせば、
そして、その誤差、打ち切り誤差O(x³)は
と評価されるであろう。
この他に、有限桁の数しか扱えないコンピュータの計算誤差には、丸め誤差と呼ばれるものがある。
たとえば、10進数の0.1は2進数で書くと
という無限小数、循環小数になってしまう。
したがって二進数の小数点8桁で打ち切ると0.00011001(二進数)となる。この0.00011001(二進数)を十進数に直すと0.09765625(十進数)となるので、十進数で0.00234375という誤差が発生することになる。
このような計算機特有の誤差を丸め誤差という。
この他に桁落ちというものがある。
例えば、
という計算を考える。
いま仮に10進数で8桁(浮動小数)しか精度を有さない計算機があるとする。
そして、これを使って上の計算を行おうとすると、
最初8桁あった有効精度が5桁に落ちてしまう。
このように、近い数同士の引き算をする場合、計算の精度が落ちてしまうことがある。
このような現象を桁落ちという。
しかし、次のように計算すると、
と精度が保たれる。
今のコンピュータ、とりわけ電卓は賢いので、どのように計算しても同じ計算結果を出すが・・・。
わかりやすいように10進数を使って説明しているけれど、正確な議論をする場合、コンピュータは2進数で計算をしているので、2進数を使って議論をしなければならない。
この点は留意して欲しい。
この他に、たとえば、十進数で3桁しか精度を持たないコンピュータの場合、1000+1を計算すると、
となってしまう。
このように、大きな数(?)と小さな数(?)の足し算でも情報が落ちる情報落ちという現象が起きる。
整数3桁しか扱えないコンピュータなどあるものかと思うかもしれないけれど、かつて存在した8ビットのパソコンで扱える整数は、特別な処理を施さないかぎり、±の符合を有する整数の場合−128〜+127、符合を有さない整数の場合0〜255だ。
という計算をするためには、符号なしの整数の場合、最低でも10ビット必要でそれほど荒唐無稽な話ではないのである。
上の有効精度3桁というのは極端な例だが、Fortranで1000000+0.001を単精度で計算させると、次のような計算結果が得られる。
0.001という情報が落ちてしまっている。
つまり、情報落ちが発生している。
また、先に話したように、0.001は、一旦、2進数に変換されるので、これを10進数に戻すときに1.00000005×10⁻³となっており、丸め誤差が発生していることもわかると思う。
このように、コンピュータで計算する場合、打ち切り誤差以外の様々な誤差が計算に混入する。そして、時に、計算途中で誤差が誤差を次々と生み出し、それが雪だるま式に膨れ上がり、この誤差の蓄積のために、とんでもない計算結果が得られるのであった。
コメント 0