运算符> =实际为真时返回false

时间:2012-04-28 13:10:46

标签: c++

我正在尝试比较两个坐标。我发现我的循环从未因此而停止:

exit = ((p.x * sign_x) >= end_pos.x) && ((p.y * sign_y) >= end_pos.y);
cout<< p.x * sign_x << " >= " << end_pos.x
    << "=" << std::boolalpha << ((p.x * sign_x) >= end_pos.x)
    << " "
    << p.y * sign_y << " >= "<< end_pos.y
    << "=" << std::boolalpha << ((p.y * sign_y) >= end_pos.y)<<endl;

exit变量永远不会变为true。在控制台中我看到:

9435.6 >= 132.6=true 180 >= 180=false

它怎么样?

所有变量均为float。值列在上面。 180作为值的变量永远不会改变。

2 个答案:

答案 0 :(得分:2)

您尚未提供p.ysign_y的示例值,因此很难确定。

但问题几乎可以肯定,p.y * sign_y并不完全等于180;但是当你打印它时它会变圆。

我怀疑如果您打印(p.y * sign_y) - end_pos.y的值,结果将不会是0

答案 1 :(得分:1)

  

180&gt; = 180 = false

这是标准的浮点精度问题。你应该在使用调试器时看到它,实际值可能是179.9999。你这样解决:

bool closeEnough = p.y * sign_y - end_pos.y >= -epsilon;

其中 epsilon 是一个足以吸收浮点计算错误的小值。 float类型只有6位有效数字,因此值大约为180.0,epsilon应该至少为0.001f。如果这还不够好,那么你需要使用double而不是float,它有15位有效数字。