2011-09-22 9 views
98

以下のコードは、最適化の有無にかかわらずVisual Studio 2008で動作します。しかし、最適化(O0)なしでg ++でしか動作しません。最適化を有効にした浮動小数点の結果が異なる - コンパイラのバグ?

#include <cstdlib> 
#include <iostream> 
#include <cmath> 

double round(double v, double digit) 
{ 
    double pow = std::pow(10.0, digit); 
    double t = v * pow; 
    //std::cout << "t:" << t << std::endl; 
    double r = std::floor(t + 0.5); 
    //std::cout << "r:" << r << std::endl; 
    return r/pow; 
} 

int main(int argc, char *argv[]) 
{ 
    std::cout << round(4.45, 1) << std::endl; 
    std::cout << round(4.55, 1) << std::endl; 
} 

出力は次のようになります。

4.5 
4.6 

しかし、G ++の最適化(O1からO3)での出力は以下となります。

4.5 
4.5 

私はトンの前volatileキーワードを追加する場合、それは動作しますが、ある種の最適化バグがあるかもしれませんか?

g ++ 4.1.2および4.4.4でのテスト。

がここideoneの結果である: http://ideone.com/Rz937

そして、私はグラムでテストオプション++単純です:

g++ -O2 round.cpp 

より興味深い結果が、でも私は、Visual Studio 2008で/fp:fastオプションをオンにし、結果はまだ正しいです。

さらに質問:私は思っていた

、私はいつも-ffloat-storeオプションをオンにする必要がありますか?

私がテストしたグラム++バージョンがCentOS/Red Hat Linux 5とCentOSの/ RedHatの6に同梱されてですので。

私はこれらのプラットフォームの下で私のプログラムの多くをコンパイルしました。私のプログラムの中で予期せぬバグが発生するかどうか心配です。このような問題があるかどうかに関わらず、すべてのC++コードを調査してライブラリを使用するのは少し難しいようです。なにか提案を?

/fp:fastのどの項目にも興味がある人は、Visual Studio 2008はまだ動作していますか? Visual  スタジオ  2008の方がg ++よりもこの問題で信頼性が高いですか?

+49

すべての新しいSOユーザーに:これはあなたが質問する方法です。 +1 – tenfour

+1

FWIW、私はMinGWを使ってg ++ 4.5.0で正しい出力を得ています。 –

+0

すべてのケースで4.5 4.6を取得します。あなたのg ++​​バージョンは何ですか?私はg ++(Debian 4.3.2-1.1)4.3.2 –

答えて

関連する問題