2012-04-28 3 views
-5

私は2つの座標を比較しようとしています。オペレータ> =は実際に真のときに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

+3

フロート/ダブルであれば、それが起こる可能性があります。 – nullpotent

+2

これは演算子 '> ='についてではありませんか? –

答えて

2

p.ysign_yという値の例は提供されていないため、わかりにくいです。

しかし、問題はほとんど確かにp.y * sign_yが正確に180に等しくないことです。ただし、印刷すると丸くなります。

私はあなたのプリント値が(p.y * sign_y) - end_pos.yなら、結果は0ではないと思っています。

+0

演算子<<が捨てられていません。 –

+0

@DenisErmolin:はい、それはデフォルトの動作です。 ['std :: setprecision'](http://en.cppreference.com/w/cpp/io/manip/setprecision)を使用して精度を指定できます。 –

1

180> = 180 =偽

これは、標準的な浮動小数点精度の問題です。デバッガを使用するときにそれを見るべきです、実際の値はおそらく179.9999のようなものです。

イプシロンは、浮動小数点演算誤差を吸収するのに十分な大きさの小さな値である
bool closeEnough = p.y * sign_y - end_pos.y >= -epsilon; 

:あなたはこのようにそれを解決します。 float型は6桁の有効数字しかないので、180.0付近の値では、εは少なくとも0.001fでなければなりません。それが十分でない場合は、floatの代わりにdoubleを使用する必要があります。有効数字は15桁です。

+0

より正確な結果を得るには、cout、setprecision()をから使用できます。 –

+0

メー、何がポイントですか?それは実際に問題を解決するものではありません。とにかく実際のデバッガの代わりにcoutを使用することはできません。 –

+0

彼は値を出力するためにcoutを使いたいと思っています。私はdebbugerの代わりにstd :: coutを使うことを提案していません...それを使用するより良い方法です; d –

関連する問題