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 ++よりもこの問題で信頼性が高いですか?
すべての新しいSOユーザーに:これはあなたが質問する方法です。 +1 – tenfour
FWIW、私はMinGWを使ってg ++ 4.5.0で正しい出力を得ています。 –
すべてのケースで4.5 4.6を取得します。あなたのg ++バージョンは何ですか?私はg ++(Debian 4.3.2-1.1)4.3.2 –