我正在尝试比较两个坐标。我发现我的循环从未因此而停止:
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
作为值的变量永远不会改变。
答案 0 :(得分:2)
您尚未提供p.y
和sign_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位有效数字。