-5

我正在尝试比较两个坐标。我发现我的循环永远不会因为这个而停止:

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。数值写在上面。as 值的变量180永远不会改变。

4

2 回答 2

2

您没有提供 and 的示例值p.ysign_y因此很难确定。

但问题几乎可以肯定p.y * sign_y是不完全等于180; 但是当你打印它时它会被四舍五入。

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

于 2012-04-28T13:28:23.267 回答
1

180 >= 180=假

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

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

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

于 2012-04-28T13:30:14.333 回答