2016-06-20 6 views
0

私は大きな問題に直面しています。何が原因で発生しているのか、どのように修正するのか分かりません。私はJavaでオブジェクトを描画するゲームを作成しています。私は線形補間を使用して、1つのフレーム内の特定の時間値でオブジェクトを移動させるために 'アルファ'値を使用します。ここで浮動小数点決定論 - Javaが間違った出力をする、C++が正しくなる

は、補間アルゴリズムがどのように見えるかです:

draw.x = current.getX() * alpha + previous.getX() * (1.0f - alpha); 

上記の値のすべてがフロート(アルファ、現在、PREVとドロー)です。

私たちは動いていないとし、current.getX()previous.getX()100.0fフロートであるとしましょう。

アルファ値はランダムです(ランダムではありませんが、数字は0.0 - 1.0)。また、浮動小数点数です。

私たちが動いていない原因、のが最適ですalpha = 0,4352343

draw.x = 100.f * 0.4352343 + 100.f * (1.0f - 0.4352343) == 43,52343 + 56,47657 == 100 

を見てみましょう - それは100でなければなりません(当社従来と現在位置が両方とも100です)。

alphaの値に関係なく、これはどのように計算されますか?常に100が返されます。

NO!

C++では完全に動作しますが、30分間出力を1000万回テストしました。常に100.0を返します。

しかし、Javaでは - そうではありません。 80,000の場合、draw.x(私たちの関数からの戻り値)が99.99999999999になる〜400-500の場合があります。

ドロー時にintを使用する必要がありますので、キャストする必要があります。そのため、99の値が与えられ、アニメーションがどうなるかを推測できます。

私はちょうど1つの質問があります - これはどのように可能ですか、上記のアルゴリズムはJavaとC++で異なる値を与えることができ、これをJavaでどのように修正するのですか?

+5

丸ごとではなく、なぜそれを投げるでしょうか? – Kayaman

+0

C++は、どのような具体的な実装を使用するかが重要です。いくつかはいくつか異なるかもしれません。 –

+0

どちらの場合でもバイナリIEEE754表現を比較しましたか?私はそれらが同じであると仮定し、ランタイムライブラリは異なるアルゴリズムを使用して浮動小数点を文字列に変換し、異なる出力**を得るようにしています。 https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlおよびhttp://stackoverflow.com/questions/7153979/algorithm-to-convert-an-ieee-754-も参照してください。文字列を二重にする –

答えて

-1

なぜそれが起こっているのかは不明ですが、丸め誤差と関係があります。これを修正するには、

正解= Math.round(answer);を使用できます。

関連する問題