以下のコードは、最適化の有無にかかわらずVisual Studio 2008で動作します。しかし、それは最適化なしのg ++でのみ機能します(O0)。
#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
tの前にキーワードを追加すると機能するので、何らかの最適化のバグがあるのでしょうか?
g ++ 4.1.2、および4.4.4でテストします。
ここideone上の結果は次のとおりです。 http://ideone.com/Rz937
そして、私がg ++でテストするオプションは簡単です:
g++ -O2 round.cpp
より興味深い結果、/fp:fast
Visual Studio 2008でオプションをオンにしても、結果は正しいです。
さらに質問:
いつも-ffloat-store
オプションをオンにする必要があるのでしょうか。
私がテストしたg ++バージョンはCentOS / Red Hat Linux 5およびCentOS / Redhat 6に同梱されているためです。
これらのプラットフォームでプログラムの多くをコンパイルしましたが、プログラム内で予期しないバグが発生するのではないかと心配しています。C ++のすべてのコードと使用されているライブラリーを、そのような問題があるかどうかを調査するのは少し難しいようです。なにか提案を?
/fp:fast
オンにしても、Visual Studio 2008がまだ機能する理由に関心がある人はいますか?Visual Studio 2008はこの問題でg ++よりも信頼性が高いようです。