首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何再现浮点cos(x)!=cos(x)

如何再现浮点cos(x)!=cos(x)
EN

Stack Overflow用户
提问于 2015-06-12 00:30:16
回答 1查看 147关注 0票数 4

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

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

代码语言:javascript
复制
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!!
  }
}

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

EN

回答 1

Stack Overflow用户

发布于 2015-06-12 00:46:06

我会尝试使用链接示例中的方法:不将结果存储到临时变量中。文章提到,浮点算术通常是在比RAM位数更多的寄存器中计算的。例如,如果只有一个浮点算术寄存器,则在执行cos计算后,必须将结果存储在随机存取存储器中,以便执行其他cos计算。摘自文章:

假设您的代码计算cos(x),然后截断结果并将其存储到一个临时变量中,比如

。然后,它可以计算cos(y),并(请鼓声)将cos(y)的未截断结果与tmp进行比较,即与cos(x)的截断结果进行比较。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30786415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档