2012-04-28 39 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

相關問題