数値計算と変換誤差
どうもYukiです。
今回は数値計算をプログラミングしていく中で、気を付けたい数値計算と変換誤差について書いていきたいと思います。
2進数と10進数
2進数、10進数という言葉、聞いたことありますか?
数値計算ではこの二つの関係は重要です。
日常で数字は10進数で表記されています。
100という数字は、10進数では100と表記されます。
コンピュータは2進数で表されます。
例えば、10という数字は10進数で10、2進数では1010と表記されます。
この2つの違いが数値計算のプログラミングをするうえで不具合の原因になることがあります。
変換誤差と不具合
実際に、私が数値計算のプログラミングをしていて変換誤差による不具合を起こしてしまいました。
不具合の原因は、10進数では表せることのできる数字が、2進数では表せない場合があるということを知らなかったからです。
具体的な数字として、0.1があります。10進数では0.1で表せるが、
2進数では、0.000110011001100…と無限に続いてしまいます。
そこで、コンピュータは有効桁として表現し、コンピュータ内のデータには0.1というきれいな数字ではない数字が記録されます。
このことを知らずに、10進数感覚で数値計算のプログラミングをした結果、不具合が起きてしまいました。
具体的には、IF文のプログラムで不具合を起こしました。
プログラムの例として、
real a
a = 式
if(a==1)then ※aが1なら
処理
end if
を書きます。
このプログラムは今思うと良くないですね(笑)
良くない所は(a==1)です。
aはrealで宣言され、aは何らかの計算をさせてます。
(realの意味はFortran 数値計算の基本にて説明)
この時点で上記で説明したように、変換誤差が発生している可能性があり、a=1という数字にならないことがあります。
実際に、私はこのようなプログラムを組みif文が機能しませんでした(悲)
この対応策としては、if(==)を使わずにプログラムすることです。
if(>) , if(<)でプログラミングできれば、不具合の可能性が減ります。
また、if(==)でプログラミングをしたいのなら、integer で宣言したものを使うと不具合の可能性が減ります。
まとめ
簡単なプログラムだと、変換誤差はあまり気にしなくていいかもしれません。
しかしプログラムが複雑になると、変換誤差が思わない所で影響する可能性があるので気にしながらプログラミングをしましょう。
関連記事