2012-04-28 79 views
-5

我试图比较两个坐标。我发现,我的循环永远不会停止,因为这样:当它真的为真时,运算符> =返回false

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

+1

你的价值是什么类型? – mydogisbox 2012-04-28 13:12:23

+3

如果他们是漂浮/双打,它可能发生。 – nullpotent 2012-04-28 13:13:11

+2

是不是关于运算符'> ='? – 2012-04-28 13:13:47

回答

2

您还没有提供p.ysign_y的示例值,因此很难说清楚。

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

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

+0

Did not know that operator << with cout rounds values。 – 2012-04-28 13:40:03

+0

@DenisErmolin:是的,这是它的默认行为。您可以使用['std :: setprecision'](http://en.cppreference.com/w/cpp/io/manip/setprecision)指定精度。 – 2012-04-28 13:41:32

1

180> = 180 =假

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

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

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

+0

你可以使用cout,setprecision()从获得更准确的结果。 – 2012-04-28 13:37:36

+0

梅,有什么意义?它实际上并没有解决问题。无论如何,使用cout并不能替代真正的调试器。 – 2012-04-28 13:46:13

+0

他想用cout来打印数值。我不是建议使用std :: cout而不是debbuger ...只能使用它的更好方式; d – 2012-04-28 13:52:58

相关问题