-5

2つの座標を比較しようとしています。これが原因でループが停止しないことがわかりました。

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です。値は上に書かれています。180as値を持つ変数は変更されません。

4

2 に答える 2

2

p.yとの値の例を提供していないsign_yため、確実に判断するのは困難です。

しかし、問題はほぼ確実に、p.y * sign_y正確に同じではありません180。ただし、印刷すると丸められます。

の値を出力する(p.y * sign_y) - end_pos.yと、結果は。ではないのではないかと思います0

于 2012-04-28T13:28:23.267 に答える
1

180> = 180 = false

これは、標準の浮動小数点精度の問題です。デバッガーを使用すると表示されるはずです。実際の値はおそらく179.9999のようなものです。あなたはそれを次のように解決します:

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

ここで、イプシロンは、浮動小数点計算エラーを吸収するのに十分な大きさの小さな値です。フロートタイプの有効数字は6桁しかないため、値が180.0前後の場合、イプシロンは少なくとも0.001fである必要があります。それでも不十分な場合は、floatの代わりにdoubleを使用する必要があります。有効数字は15桁です。

于 2012-04-28T13:30:14.333 に答える