bgo*_*odr 3 c c++ math logarithm compiler-optimization
下面,result1和result2变量值报告不同的值,具体取决于您是使用-g还是使用-O在GCC 4.2.1和GCC 3.2.0上编译代码(我还没有尝试过更新的GCC版本) :
double double_identity(double in_double)
{
return in_double;
}
...
double result1 = ceil(log(32.0) / log(2.0));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result1==" << result1 << std::endl;
double result2 = ceil(double_identity(log(32.0) / log(2.0)));
std::cout << __FILE__ << ":" << __LINE__ << ":" << "result2==" << result2 << std::endl;
Run Code Online (Sandbox Code Playgroud)
result1和result2 == 5仅在使用-g进行编译时,但如果使用-OI进行编译,则得到result1 == 6和result2 == 5.
这似乎与编译器完成优化的方式不同,或者内部与IEEE浮点表示有关,但我很好奇这种差异究竟是如何发生的.我希望尽可能避免看汇编程序.
以上是用C++编译的,但我认为如果使用printfs将其转换为ANSI-C代码,则会保持相同.
上述差异发生在32位Linux上,但不适用于64位Linux.
谢谢bg