2017-01-09 9 views
-2

私は、次のコードを書いたCプログラミングフロート状態のためのwhileループの異常行動は、

[email protected]:/mnt/d/Codes/LetUsC$ gcc C04Ag.c 
[email protected]:/mnt/d/Codes/LetUsC$ ./a.out 
Hello! 
Bye! 

かどうかを確認するには浮動小数点条件を受け入れるかどうか、私はこのコードを書いた:

#include <stdio.h> 

int main() 
{ 
    float x = 1.1; 
    printf("%s\n", "Hello!"); 
    while (x >= 1.0) 
    { 
    printf("%s\n", "Hey there!"); 
    printf("%f\n", x); 
    x = x - 0.1; 
    } 
    printf("%s\n", "Bye!"); 
    return 0; 
} 

私は期待どおりの出力を得た。だから、

[email protected]:/mnt/d/Codes/LetUsC$ gcc C04Ag.c 
[email protected]:/mnt/d/Codes/LetUsC$ ./a.out 
Hello! 
Hey there! 
1.100000 
Hey there! 
1.000000 
Bye! 

、私の質問は、は私が最初のコードに間違って何をやっているのですか?

UPDTATE:このエラーを修正する方法を理解しました。このような 別記while条件:while (x == 1.1f)

+1

@kaylum:ありがとうございます!ちょうど何が間違っているのか分かりました。次のような条件を追加しました: 'while(x == 1.1f)' – aps120797

+2

よく、いいえ。問題は、浮動小数点値を比較して、等しいかどうかを判断することです。浮動小数点数は常に近似値なので、平等チェックは失敗することがよくあります。 – Jasen

答えて

1

1.1はそれがdouble値だ、float値ではありません。

float x = 1.1;と記述すると、コンパイラは暗黙のキャスト:float x = (float)1.1;を挿入します。

x == 1.1と記述すると、コンパイラは別の暗黙的なキャスト:(double)x == 1.1を挿入します。

floatにキャストしてdoubleにキャストした後でも1.1が同じ値であるかどうか、つまり(double)(float)1.1 == 1.1がtrueであるかどうかを、効果的にテストしています。

(double)(float)1.1 == 1.1は、浮動小数点の丸め誤差のため真ではありません。私のプラットフォーム上に、少なくとも:

  • 1.11.100000000000000088817841970012523233890533447265625
  • (double)(float)1.1が実際に1.10000002384185791015625

であり、あなたは、これら2つの数字が同じではありません見ることができるように実際にあります。

+0

ありがとう!ちょうど何が間違っているのか分かりました。次のような条件を追加しました: 'while(x == 1.1f)' – aps120797

関連する問題