下面的代码可以在 VisualStudio2008上进行优化和不进行优化。但是它只能在没有优化(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。
以下是关于 ideone 的结果: http://ideone.com/Rz937
我在 g + + 上测试的选项很简单:
g++ -O2 round.cpp
更有趣的结果是,即使我在 VisualStudio2008上打开 /fp:fast
选项,结果仍然是正确的。
进一步问题:
我在想,我是否应该总是打开 -ffloat-store
选项?
因为我测试的 g + + 版本是 红帽 Linux 和 CentOS/Redhat 6。
我在这些平台下编译了许多程序,我担心它会在我的程序中引起意想不到的错误。调查我所有的 C + + 代码和使用的库是否有这样的问题似乎有点困难。有什么建议吗?
有人对为什么即使 /fp:fast
开启了,VisualStudio2008仍然可以工作感兴趣吗?看起来 Visual Studio 2008在这个问题上比 g + + 更可靠?