4

如何重现这种行为? https://isocpp.org/wiki/faq/newbie#floating-point-arith2

准确地说,在下面的代码中,参数xy是相等的;它们可以等于 1.0 或任何其他值。

void foo(double x, double y)
{
  double cos_x = cos(x);
  double cos_y = cos(y);
  // the behavior might depend on what's in here
  if (cos_x != cos_y) {
    std::cout << "Huh?!?\n";  // You might end up here when x == y!!
  }
}

一些编译器选项?环形?任何想法?

4

1 回答 1

3

我会尝试按照链接示例中的方式进行操作:不将结果存储到临时变量中。文章提到浮点运算通常在比 RAM 具有更多位的寄存器中计算。例如,如果只有一个浮点算术寄存器,那么在进行cos计算之后,结果必须存储在 RAM 中,以便进行其他cos计算。来自文章:

假设您的代码计算 cos(x),然后截断该结果并将其存储到临时变量中,例如 tmp。然后它可能会计算 cos(y),并且(请打鼓)将 cos(y) 的未截断结果与 tmp 进行比较,即与 cos(x) 的截断结果进行比较。

当您将两个结果都存储在变量中时(取决于优化等),第二次cos计算的结果很有可能在计算之前也将存储在 RAM 中。由于结果将以相同的方式截断,因此它们将比较为==

于 2015-06-11T16:46:05.833 回答