- ベストアンサー
計算に誤差が出る?
0.1 + 0.2 + 0.3・・・・・・ このように行うプログラムを2通りに分けて処理をして見ました。 以下にソースを載せます。 #include <stdio.h> int main() { float sum, i; float sum2; int f; for(i=0.1, sum=0.0; i<=100.0; sum+=(float)i, i+=0.1); printf("%f\n", sum); for(f=1, sum2=0.0; f<=1000; sum2+=(float)f/10.0, f++); printf("%f\n", sum2); return 0; } 初めのfor文と2番目のfor文では同じ処理を行っているのですが、計算結果が微妙に異なって出力されてしまいました。 理由が分かる方は教えてもらえないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
noname#30727
回答No.4
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
回答No.3
- buriburi3
- ベストアンサー率44% (353/792)
回答No.2
- Werner
- ベストアンサー率53% (395/735)
回答No.1
お礼
返答ありがとうございました。ためしに以下のプログラムを作成しました。 for(i=0.333, sum=0.0; i<=3; sum+=(float)i, i+=0.333){ printf("%.3f\n", sum); } for(f=1, sum2=0.0; f<=10; sum2+=(float)f/3.0, f++){ printf("%.3f\n", sum2); } AsanoNagiさんがおっしゃられたとおりになりました。 少しまとめていってしまえば上のfor文では毎回0.0003333の誤差が累積していくのに対し、下のfor文では0.3333333333333333・・・と表現できるところまでの少数桁を毎回加算して、表示のときに四捨五入をして 切り詰めて表示をしているため、まず3回目のところで、1.000と0.999の値が出てしまうんですね。