- ベストアンサー
計算の誤差
a = 0; for(z=0;z<100;z++){ a += 0.04; printf("%f\n",a); } という簡単なプログラムでaを0.04ずつ大きくしていきたいのですが、これを実行すると、 …… 1.680000 1.720000 1.760000 1.799999 1.839999 1.879999 1.919999 …… といった風にわずかな誤差が生じてしまいます。 この誤差をなくす方法は無いでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
本質的にはありません。 が、 ・int ではこの誤差は発生しない ・少数部分を含まない浮動小数点ではこの誤差は発生しない という事が言えませすので、 double a = 0; int ia = 0; for(int z = 0; z < 100; z++) { ia += 4; a = ia / 100.0; } というようなことで回避はできます。 おまけ。 0.4 だとこういうことがおきますが、たとえば、0.03125 だとこの誤差は発生しません。 a = 0; for(z=0;z<100;z++){ a += 0.03125; printf("%f\n",a); } これは、0.03125 = 1/2/2/2/2/2 と、/2 だけで表現できるからです。
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
2進実数を10進実数に変換すると、2のべき乗の 和で表わされる値以外は必ず誤差がでます。 10進数の何桁まで信用できるかは単精度で6、 倍精度で16桁とされています。従って、金利の 計算などでは最初から有効桁と丸め方を決めて います。これ以上の精度が必要な場合は自力で エミュレータを作るなどの処置が必要です。
- Tacosan
- ベストアンサー率23% (3656/15482)
ISO/IEC TR 24732 をサポートしている C の処理系なら _Decimalなんとか を使う. ISO/IEC TR 24733 をサポートしている C++ の処理系なら std::decimal::decimalなんとか を使う. どちらでもなかったらあきらめる.
お礼
ありがとうございました。