Now Know No Limits.

なののり。日々のしょうもない書き散らし。

桁落ちの問題

2007-05-10 23:56:21 | 科学技術関連
 ある数aとある数bの差が非常に小さい場合,コンピュ-タあるいは有限桁数で引き算(c = a - b の計算)を行うと次のようなことが起こります.
 まず,具体的な数値として,a = √5001, b = √5000 とします.
 それぞれ計算させてみると,a= 70.7177488329486,b= 70.7106781186548 となりました.どちらも似たような値になっています.また,それぞれ有効桁数は15です.
 そのまま素直に a - b の引き算をさせてみると
c = a - b
= √5001 -√5000
≒ 70.7177488329486 - 70.7106781186548
≒ 0.0070707142938
 引き算の結果 c の有効桁数は11となってしまいました.
 このように引き算の計算を行うと有効桁数が減少して,「桁落ち」という誤差が発生します.
 今回のように一回きりの計算なら,特に問題ないのですが,繰り返し何万回と計算させる場合はこうした小さな誤差が積み重なって最終的に無視できないほどになることがあります.

 さて解決編.
 これを解決するには次のような計算を行います.まず,簡単な因数分解から,
a2 - b2 = (a + b)(a - b)
 左辺には a - b が含まれています.ここで式を変形すると
a - b = (a2 - b2)/(a + b)
 という a - b と同じ意味を持つ式が得られます.桁落ちは素直な引き算の代わりにこの(a2 - b2)/(a + b)という計算を用いることで回避することが出来ます.

 実際に得られた式で計算してみると
c = (a2 - b2)/(a + b)
= (5001 - 5000)/(70.7177488329486 + 70.7106781186548)
= 1/141.4284269516034
= 0.007070714293825818763283623
 となりました.
 はじめの計算結果の有効桁数が11であったのに対し,有効桁数が十分確保できていることが分かります.

 以上,今日の数値解析で目から鱗のコーナーでした.

最新の画像もっと見る

post a comment