実数計算における誤差

誤差と一口に言いましても色々と種類がありますが、今回は
10進数の小数を2進数に正確に変換できない場合があるという
話をします。

これはどういうことかといいますと、例えば、10進数でも
1/3なんかは0.33333…となってしまい、

本来1/3を3倍すると1になるはずなのに
0.33333…を3倍しても0.99999…となってしまい、

両者の間に誤差が発生することが知られていますよね?


これと同様に、例えば0.1という10進数の小数は正確に
2進数で表現することはできません。

どのようになるかというと、

0.0001100110011001100...

というように循環小数として表されることになります。

さて、これが一体何の問題があるのかというと、
以下のプログラムを実行してみてください。
これは、0.1を1000回足し合わせるだけの単純なものです。


#include
using namespace std;

int main(int, char **)
{
float sum = 0.0f;

for(int i=0; i<1000; i++){
sum += 0.1f;
}

cout << "合計: " << sum << endl;

return 0;
}

さてどうでしょう。実行結果は期待する100という数値には
なってくれず、99.999となってしまいましたね。

10000回ループしてみると誤差はさらにはっきり現れ、
999.903となってしまいます。

もちろんdouble型にするなど精度を上げることで、
より正確な数値に近づけることは出来ます.

大切なのはプログラミングをする際には、

実数計算には誤差が伴っているんだ

ということを常に意識しておくことです。
[PR]
by pcinfo | 2004-12-25 03:57