如何重现浮点cos(x)!= cos(x)

时间:2015-06-11 16:30:16

标签: c++ c floating-point-precision x87

如何重现此行为? 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!!
  }
}

一些编译器选项?环?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

  

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

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