-4

重複の可能性:
浮動小数点比較

うーん、これは奇妙なものです。通常、以下if( 4.0 == 4.0 ){return true}は常に を返しtrueます。私が持っている単純な小さなopengl 3d「シューター」プログラムでは、「ジャンプ」効果を追加しようとすると、そうではありません。

アイデアはかなり単純です。三角形のストリップの地形があります。「キャラクター」が移動/歩行すると、高さの2次元配列に沿って移動するため、丘/谷のさまざまな高さを上下に歩きます。

関数の外側drawScene()(または、opengl を知っている場合glutDisplayFunc()) にupdate()は、キャラクターが「ジャンプ」するときにキャラクターを上下させる関数があります。これは で呼び出されdrawScene()ます。つまり、私が説明できる限りの高レベルのジャンプ アルゴリズムは次のとおりです。

パラメーター:

double currentJumpingHeight
double maximumJumpingHeight = 4.0
double ypos;
const double jumpingIncrement = 0.1; //THE PROBLEM!!!! HAS TO BE A MULTIPLE OF 0.5!!
bool isJumping = false;
bool ascending = true;

アルゴリズム:

(when space is pressed) isJumping = true.

if ascending = true and isJumping = true, 
      currentJumpHeight += jumpingIncrement (and the same for ypos)

if currentJumpingHeight == maximumJumpingHeight, //THE PROBLEM
     ascending = false
     (we decrement currentJumpingHeight and start to fall until we hit the ground.)

非常に単純ですが、 jumpingIncrement が0.5!!の倍数の場合にのみ機能します。

jumpingIncrementが、たとえば の場合0.1、とcurrentJumpingHeight等しくなることはありませんmaximumJumpingHeight。キャラクターはロケットのように離陸し、地上に戻ることはありません。2 つの変数が標準出力に出力され、それらが同じであっても、条件が真になることはありません。これは私が解決したい問題です、それはばかげています。

ジャンピング アルゴリズムに関するフィードバックは必要ありません。上記の段落のみをお願いします。

助けてください。

4

2 に答える 2

5

これは典型的な浮動小数点精度の問題です。特に0.1、2 進浮動小数点を使用して正確に表現することはできません。一方、0.5 や 0.25 などの数値は正確に表現できるため、おそらく機能します。その場合でも、コンパイラは自由に動作させないと思います。

あなたの場合、ソリューションは次を使用してい>=ます:

if ascending && (currentJumpingHeight >= maximumJumpingHeight)
     ascending = false
     currentJumpingHeight = maximumJumpingHeight

イプシロン比較を使用することもできますが、可能な場合は避けます。あなたの場合、単純な>=ものはイプシロンの同等性よりもきれいに見えます。

于 2012-06-16T16:33:20.773 に答える
3

人々が言っ​​たように、これは典型的な浮動小数点の問題です。これを見てください 基本的に、同じように有限桁数でコード化することはできません1/3を基数10で

1/3 = 0.3333333333.....

基数 2 で 1/10 を実行することはできません。

0.1 = 0x0.0001100110011001100110011001100110011001100110011...

フロートを比較するべきではありませんが、差が値よりも小さいことを確認してください。

if (fabs(a-b) < 1e-6)

それ以外の

if(a==b)

もちろん、あなたの場合は、「> =」を使用してください。

0.5 はバイナリで 1/2 または 0.1 であるため、0.5 の増分で機能するため、適切にコーディングされています。これは 2 の任意の累乗、つまり 0.5 または 0.125 で機能しますが、0.1 では機能しません。

于 2012-06-16T16:45:59.340 に答える