2016-05-05 12 views
-1

g ++(4.6.3)で小さなC++プログラムをコンパイルすると、ちょっと変わった動作が発生しました。 2つのfloat摂氏とテストの比較:奇妙なコンパイラの振る舞い

#include <iostream> 
using namespace std; 

int main() { 
    float fahrenheit = 0; 
    float celsius = 0; 
    float test = 0; 

    cout << "Temperature in °F: " << endl; 
    cin >> fahrenheit; 

    celsius = 5/9 * (fahrenheit - 32); 
    test = 5 * (fahrenheit - 32)/9; 

    cout << "\nWrong:\t" << fahrenheit << " °F = " << celsius << " °C" << endl; 
    cout << "Correct:" << fahrenheit << " °F = " << test << " °C" << endl; 
} 

私はちょうど「G ++ます。test.cpp -oテスト」でこれをコンパイルしました。

これは、プログラムの出力です:テストは正解が含まれているのに対し、G ++(再現性)、0に摂氏を計算しない理由

$ ./test 
Temperature in °F: 
1000 

Wrong: 1000 °F = 0 °C 
Correct:1000 °F = 537.778 °C 

は、誰かが私に説明できますか?私はそれについて何も設定していませんでしたが、いくつかの最適化とは何か関係がありますか?あるいはこれは本当に何らかの形でバグですか?

+0

整数部! –

答えて

2

5/9 = 0

0 *何も= 0

あなたが整数に分割するとき、あなたは整数を取り戻します。あなたはちょうど5.0/9と言うことができ、それはずっと良いはずです。

あなたがコードを書いていて、期待したものが得られないときは、最初の傾きは「どのようなdod が間違っていますか? 「コンパイラは何を間違っていましたか」ではありません。

ほとんどの場合、適切な場所を探すのに役立ちます。

+0

うん、それはそれを爪。ありがとう! – Mark

+0

これは非常に一般的な間違いです。初心者の方には大抵の場合ですが、まだまだ尻を噛んでいます。あなたの質問が解決したら、その左側のチェックボックスをクリックして答えとして受け入れてください。それが良い答えだと思うなら、上向き矢印をクリックすることもできます。 – xaxxon