我有以下代码,它表现出一些非常奇怪的行为。有谁知道为什么。
#include <iostream>
long global = 20001;
double foo() {return global / 1000.0;}
int main(int,char**) {
if (foo() == foo()) {
std::cout << "true\n";
} else {
std::cout << "false\n";
}
return 0;
}
这应该打印 true,因为函数每次返回相同的结果,但打印 false;
这是在 Solaris 10 上使用 g++ 构建的。 我不知道操作系统是否重要,但我还没有机会在不同的操作系统上尝试
最佳答案
操作系统可能并不重要,但编译器和 建筑做。在 Intel 上,通常的约定是返回 浮点寄存器中的浮点值,其中有 64 位精度(而不是 double 的 53 位)。和的 当然,编译器直接进行算术运算 寄存器,所以最终返回一个 64 位的值 精度。
当然,当编译器生成调用函数的代码时,
它不能将值保留在寄存器中,因为该函数可能会
使用该寄存器。所以它会将其溢出到内存中。作为双
56 位。 ==
运算符比较来自
第一个调用使用第二个中的 64 位值,并发现
他们并不平等。
我可能会补充一点,如果编译器内联函数,问题可能就会消失。
根据标准,所有这些都是完全合法的。
关于C++比较函数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414670/