以下代码在经过优化和未经优化的情况下均适用于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
但是带有优化(O1
- O3
)的g ++ 将输出:
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 ++更可靠?