2017-08-20 2 views
0

計算結果を変数に代入して出力しようとした。ただし、割り当てられている変数のタイプによっては結果が異なります。しかし、予期せぬ結果は、この特定の計算の特定の値に対してのみ発生しました。C++ intまたはdoubleに割り当てられた同じ計算結果が異なるが、特定の値のみである(C++では64.02のマジックナンバー?)

int main() { 

    // anything above 64.02 give unexpected results 
    // e.g. (100.02 - 100.0) * 100.0 

    int a ((64.02 - 64.0) * 100.0); 
    double b ((64.02 - 64.0) * 100.0); 

    cout<<"result: "<<a<<endl; // result: 1, expected result: 2 
    cout<<"result: "<<b<<endl; // result: 2, expected result: 2 

    // anything below 64.02 give right results 

    int c ((63.02 - 63.0) * 100.0); 
    double d ((63.02 - 63.0) * 100.0); 

    cout<<"result: "<<c<<endl; // result: 2, expected result: 2 
    cout<<"result: "<<d<<endl; // result: 2, expected result: 2 

    return 0; 
} 

この質問は非常に具体的ですが、暗黙の型キャストと関係があると思われます。しかし、なぜ値> = 64.02の場合のみですか?

これは、スタックオーバーフローに関する私の最初の質問です。

+0

64.01を試しましたか? – nicomp

+0

はい、64.01はintとdoubleの両方に期待される結果を示しました。何か<64.02が期待した結果を出しました... –

+0

結果はどうだと思いますか、結果はどうなっていますか? – nicomp

答えて

1

浮動小数点としての64.02表現は、実際には64.01999664306640625です。計算後、1.999664306640625が得られます。これは、intに切り捨てられたときに1になります。

63.02の表示は63.020000457763671875で、計算後は2になります。これは整数に切り捨てられます。

一部の数値は、floatまたはdoubleと正確には保存できません。

+0

aha!意味がある!申し訳ありませんが重複した質問として指摘されていますが、私は長い間その回答を検索しようとしたことを誓っています。私が検索した質問はあまりにも具体的だと思います。 –

関連する問題