アカウント名:
パスワード:
十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。
バグったコードからエラー原因を簡素化したテストコードは以下。float型(i)とint型(k)で1ずつ加算していって異なったら標準エラーに出力。
#include <stdio.h>int main(){ float i; int k; i=0; for(k=0;k<=16777217;k++){ if(k != (int)i) fprintf(stderr,"%i %i\n",k,(int)i); i += 1; } return 0;}
型付きでintだから問題ありませんが、ループの終了条件に等号を使用してはいけないとかですね。誤差でループ回数が変わったり無限ループに陥ったりします。
わたしの場合ですが、ロジックが不自然でなければ、整数型でも、等号より大なりなどの比較演算子を使うようにしています。
一応、コードの変更で加算が入るかも、という正当な理由はあるのですが、どちらかというとパラノイアな「なんとなくこっちのほうが安心」という気持ちに従っているだけの気もします。
// などと書いていたら、『「等号に掛からなくなるような当初想定しなかった変更があっても、とりあえずエラーにならない」コーディングは逆に、のちのち大きなバグを生む種になりかねないのでは?』と不安になってきたぞ、と。
問題なのはi+=1;だと思われ
Cのfloat, doubleについての等号は丸め誤差を考慮してなかったような気がする。FORTRANだと考慮してくれる。でも浮動小数点に等号は使わないな。
C ではないですが、、昔々 Logitech の Modula-2 を使ってプログラムを組んでいる時に、2つの float型変数の値を printf() で確認すると両方とも同じ値なのに等号が成り立たなくて発狂しそうになりました。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
吾輩はリファレンスである。名前はまだ無い -- perlの中の人
floatで整数を数えあげちゃいけない@C言語 (スコア:1)
十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。
バグったコードからエラー原因を簡素化したテストコードは以下。
float型(i)とint型(k)で1ずつ加算していって異なったら
標準エラーに出力。
Re:floatで整数を数えあげちゃいけない@C言語 (スコア:0)
型付きでintだから問題ありませんが、ループの終了条件に等号を使用してはいけないとかですね。
誤差でループ回数が変わったり無限ループに陥ったりします。
Re:floatで整数を数えあげちゃいけない@C言語 (スコア:2)
わたしの場合ですが、ロジックが不自然でなければ、整数型でも、等号より大なりなどの比較演算子を使うようにしています。
一応、コードの変更で加算が入るかも、という正当な理由はあるのですが、どちらかというとパラノイアな「なんとなくこっちのほうが安心」という気持ちに従っているだけの気もします。
// などと書いていたら、『「等号に掛からなくなるような当初想定しなかった変更があっても、とりあえずエラーにならない」コーディングは逆に、のちのち大きなバグを生む種になりかねないのでは?』と不安になってきたぞ、と。
Re: (スコア:0)
問題なのは
i+=1;
だと思われ
Re: (スコア:0)
Cのfloat, doubleについての等号は丸め誤差を考慮してなかったような気がする。
FORTRANだと考慮してくれる。でも浮動小数点に等号は使わないな。
Re: (スコア:0)
C ではないですが、、昔々 Logitech の Modula-2 を使ってプログラムを組んでいる時に、
2つの float型変数の値を printf() で確認すると両方とも同じ値なのに等号が成り立たなくて発狂しそうになりました。