【发布时间】:2010-07-24 05:08:12
【问题描述】:
下面,result1 和 result2 变量值根据是否报告不同的值 您在 GCC 4.2.1 和 GCC 3.2.0 上使用 -g 或 -O 编译代码(我还没有尝试过更新的 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;
result1 和 result2 == 5 仅在使用 -g 编译时,但如果改为使用 -O 编译,我会得到 result1 == 6 和 result2 == 5。
这似乎是编译器如何进行优化的差异,或者与内部的 IEEE 浮点表示有关,但我很好奇这种差异究竟是如何发生的。我希望尽可能避免查看汇编程序。
上面是用 C++ 编译的,但我认为如果使用 printfs 将其转换为 ANSI-C 代码,情况也是如此。
上述差异发生在 32 位 Linux 上,但不在 64 位 Linux 上。
谢谢 bg
【问题讨论】:
-
你应该从中吸取的教训:不要使用浮点 log/pow/etc。当您想要执行精确的整数运算时使用函数(或任何浮点数),除非您拥有数值分析博士学位。
-
同意。在我的辩护中,我使用的代码 sn-p 是另一个开发人员代码的精简副本,当然它坏了,这就是我在这里的原因。
标签: c++ c math compiler-optimization logarithm