gpt4 book ai didi

c++ - 将 double 类型传递给 ceil 会导致 GCC 中不同优化级别的不同值

转载 作者:太空狗 更新时间:2023-10-29 20:31:51 26 4
gpt4 key购买 nike

下面,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 上。

谢谢背景

最佳答案

在 x86 上,通过优化,子表达式的结果在用作更大表达式的一部分之前不一定存储到 64 位内存位置。

因为 x86 的标准浮点寄存器是 80 位,这意味着在这种情况下,额外的精度是可用的。如果您随后将这个特别精确的值除以(或乘以)另一个值,则精度提高的效果会放大到肉眼可以察觉的程度。

Intel 的 64 位处理器使用 SSE 寄存器进行浮点运算,而这些寄存器没有额外的精度。

你可以玩弄 g++ flags如果您真的很在意,可以解决这个问题。

关于c++ - 将 double 类型传递给 ceil 会导致 GCC 中不同优化级别的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com