运算符 >= 在实际为 true 时返回 false。

Operator >= returns false when it actually true

本文关键字:true 返回 false gt 运算符      更新时间:2023-10-16

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

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为值的变量永远不会改变。

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

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

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

180>= 180=假

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

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

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