C++比较函数结果

标签 c++ gcc g++

我有以下代码,它表现出一些非常奇怪的行为。有谁知道为什么。

#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/

相关文章:

linux - 我可以强制编译器将我的共享库也放入二进制文件中吗?

c++ - 不适合( auto && v : arr ) clobber the contents of the array?

c++ - by-value传递参数的内存消耗对比。引用

c - 为什么启用优化后 GCC 11 编译器会产生奇怪的输出?

c - 负数和无符号分母的模运算的奇怪结果

c++ - 从 MinGW 链接到 MSVC DLL

c++ - 常用 C++ 优化技术列表

c++ - constexpr 数组初始化

C++ - 将数组从一个函数传递到另一个函数

c - MSYS2 未定义对 _imp__XXXXXXXX 的引用