C 比较功能结果

c++ compare function result

本文关键字:结果 功能 比较      更新时间:2023-10-16

我具有以下代码,这些代码表现出一些非常奇怪的行为。有人知道为什么吗?

#include <iostream>
long global = 20001;
double foo() {return global / 1000.0;}
int main(int,char**) {
  if (foo() == foo()) {
    std::cout << "truen";
  } else {
    std::cout << "falsen";
  }
  return 0;
}

这应该在函数每次返回相同的结果时打印true,而是打印false;

这是在Solaris 10上使用G 构建的。我不知道操作系统很重要,但是我没有机会在其他OS

上尝试它。

OS可能无关紧要,但是编译器和编译器体系结构做。在英特尔上,通常的惯例是返回浮点寄存器中的浮点值64位精度(而不是双重的53位)。和当然,编译器将算术直接完成注册,因此您最终以64位返回值精度。

当然,当编译器生成代码调用函数时,它不能将值留在寄存器中,因为该功能可能使用该寄存器。因此,它将其溢出到内存。作为双重56位。==操作员比较了此56位值第一次打电话给第二个位值,并发现他们不等。

我可能会补充说,如果编译器嵌入了功能,问题可能会消失。

根据标准,所有这些都是完全合法的。

可能的问题可能会始终无法评估到完全相同的值(本质上是四舍五入错误)。

如果要将功能更改为返回整数,则可能会有预期的行为。

与这个问题非常相似:涉及比较浮子

尝试以下操作:

#include <iostream>
#include <limits>
long   global = 20001;
double epsilon = std::numeric_limits::epsilon<double>();
double foo() {return global / 1000.0;}
int main(int,char**) {
  if (foo() - foo() > epsilon) {
    std::cout << "truen";
  } else {
    std::cout << "falsen";
  }
  return 0;
}