2016-04-27 1 views
3

を一貫性のないintにfloatをキャスト、私はこれらの命令を使用してintfloat値をキャストしようとしている:C++を使用したMinGWのとクラン間で

#include <iostream> 

int main() { 
    float NbrToCast = 1.8f; 
    int TmpNbr = NbrToCast * 10; 
    std::cout << TmpNbr << "\n"; 
} 

私は値1.8が正確floatとして表現することはできません理解実際には1.79999995として格納されています。

したがって、この値に10を掛けると17.99999995になり、intにキャストすると、17となります。

このコードをWindows 7でMinGW(v4.9.2 32ビット)でコンパイルして実行すると、予想通りの結果(17)が得られます。

私のMac(X 10.11 OS)上でCLang(v600.0.57)で、このコードをコンパイルし、実行しているとき、私は私が期待していたものではありませんが、よりは、数学的にを修正思われる結果として、18を取得方法!

なぜこの違いが生じるのですか?

OSやコンパイラに関係なく一貫した動作を実現する方法はありますか?

+2

https://stackoverflow.com/questions/18494237/floating-point-mismatch-between-compilers-visual-studio-2010-and-gcc – v7d8dpo4

+0

最後の行を 'std :: cout << stdに変更してみてください::精度(20)<< TmpNbr << "" \ n ";' –

+0

@RichardCritten: 'TmpNbr'は' int'で、 'std :: precision(20)'のポイントは何ですか? – Nawaz

答えて

-1

Yuushiさんのコメントによると、丸めルールは各コンパイラごとに異なる場合があります。このようなトピックでポータブルなソリューションを用意することは、おそらく独自の丸めメソッドを作成する必要があることを意味します。

あなたのケースでは、7の後に数字の値をチェックして値を増やす必要があるかもしれません。以下のようなものを言ってみましょう:

int main() { 
    float NbrToCast = 1.8f; 
    float TmpNbr = NbrToCast * 10; 
    std::cout << RoundingFloatToInt(TmpNbr) << "\n"; 
} 

int RoundingFloatToInt(const float &val) 
{ 
    float intPart, fractPart; 
    fractpart = modf (val, &intpart); 
    int result = intPart; 
    if (fractpart > 0.5) 
    { 
    result++; 
    } 
    return result; 
} 

(コードすべてでテストが、あなたのアイデアを持っていない)

パフォーマンスが必要な場合、それはおそらく素晴らしいではありませんが、私はそれが移植されるべきだと思います。

関連する問題