フロートをループカウンターとして使用し、以下のようなリスクのないプログラムのように、繰り返しごとに小数点以下をインクリメント/デクリメントすることは安全ですか?もちろん、==演算子はdo.butすることは愚かなことです。しかし、 "通常の"目的のための他の比較演算のための浮動小数点数をオペランドとして使うことは何が問題なのですか? "普通"とは、たとえ浮動小数点数がでない場合でも、数値の数値表現の数値表現ではありませんが、0.000000001
のようなバリエーションではなく、ほとんどの場合無視できますか?ループカウンタとしてfloat変数を使用するリスクと、非 "=="条件に対して小数点以下の増減を行うリスクはありますか?
しかし、それは言った(でも明らかではない次のプログラムで例えば)、ここで私のapprehension.Supposeある表現は正確ではありません。そして、我々はデクリメントに行くよう5.0は実際に4.999999。だからであります0.5の各繰り返しで、との最後の比較が偽になり、0.000001の差によってループが終了し、現在の出力の最後の行は表示されません。私はあなたが私のドリフトを得ていることを願っています。私は間違っていますか?
#include<stdio.h>
int main(void)
{
float f;
for(f=5.0;f>=0;f-=0.5)
printf("%f\n",f);
}
出力:
5.000000
4.500000
4.000000
3.500000
3.000000
2.500000
2.000000
1.500000
1.000000
0.500000
0.000000
+1いい回答です。 –
これらの基準はゼロで終了するループに適用されることは明らかです。たとえば、+ Xから-Yまでループする場合、YがXより大きい場合、エラーが発生する可能性があります。 –
@EricPostpischil:結果値が表現可能でなければならないという条件は、そのケースをカバーしていると思いますか? – nhahtdh