如何重现这种行为?https://isocpp.org/wiki/faq/newbie#floating-point-arith2
准确地说,在下面的代码中,参数x和y是相等的;它们可以等于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!!
}
}一些编译器选项?循环?有什么想法吗?
发布于 2015-06-12 00:46:06
我会尝试使用链接示例中的方法:不将结果存储到临时变量中。文章提到,浮点算术通常是在比RAM位数更多的寄存器中计算的。例如,如果只有一个浮点算术寄存器,则在执行cos计算后,必须将结果存储在随机存取存储器中,以便执行其他cos计算。摘自文章:
假设您的代码计算cos(x),然后截断结果并将其存储到一个临时变量中,比如
。然后,它可以计算cos(y),并(请鼓声)将cos(y)的未截断结果与tmp进行比较,即与cos(x)的截断结果进行比较。
当您将两个结果都存储在变量中时(取决于优化等)第二次cos计算的结果很有可能也会在计算之前存储在内存中。由于结果将以相同的方式截断,因此它们将与==进行比较。
https://stackoverflow.com/questions/30786415
复制相似问题