以下代码在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
如果我在t之前加上
volatile
关键字,它就能正常工作,那么可能存在某种优化错误吗?在g++ 4.1.2和4.4.4上进行测试。
这是在ideone上的结果: http://ideone.com/Rz937 我在g++上测试的选项很简单:
g++ -O2 round.cpp
更有趣的是,即使我在Visual Studio 2008中打开了
/fp:fast
选项,结果仍然正确。进一步的问题:
我想知道,我是否应该总是打开
-ffloat-store
选项?因为我测试的g++版本是随CentOS/Red Hat Linux 5和CentOS/Redhat 6一起提供的。
我在这些平台下编译了许多程序,担心会在我的程序中引起意外的错误。看起来要调查所有我的C++代码和使用的库是否存在这样的问题有点困难。有什么建议吗?
是否有人对为什么即使打开了
/fp:fast
,Visual Studio 2008仍然可以工作感兴趣?看起来Visual Studio 2008在这个问题上比g++更可靠?