引用:組込みソフトウェア開発向けコーディング作法ガイド [C言語版]のR 2.1.2
void func() {
double d;
for( d=0.0; d < 1.0; d += 0.1 ) {
...
void func() {
int i;
for(int i=0; i < 10; i++) {
...
浮動小数点数は、ループカウンタとして演算が繰り返されると、誤差が累積し、意図した結果が得られないことがある。このため、ループカウンタには整数型を使用すべきである。
関連して以下を思い出した。
http://d.hatena.ne.jp/toburau/20120114/1326558361
float変数に1を1億回足した答えは1677万だ。
doubleの場合はもっと精度が高いので、上記floatのような問題はないだろうが、ループカウンタとしてdoubleを使う時はきちんとループするか確認するのがいいだろう。
。。。と書きながら疑問を持った。はたして本当にだめなのか?
http://ideone.com/GqZScD
にdouble型の1.0を1億回たすコードを用意してところ、結果は1億であった。
なぜコーディング規約で禁止されているか?
「組込み」がキーワードにあるように思う。
組込みの世界ではdoubleという型が内部的にはfloat型で実装される例がある。float型での場合、上記に見たように誤差が累積し、ループが正常に実行されなくなる。
doubleを内部的にdoubleできちんと扱う環境では、この問題は発生しない。
実行環境のdoubleの実装がどうなっているか、注意したほうがいいだろう。