私は大きな問題に直面しています。何が原因で発生しているのか、どのように修正するのか分かりません。私は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でどのように修正するのですか?
丸ごとではなく、なぜそれを投げるでしょうか? – Kayaman
C++は、どのような具体的な実装を使用するかが重要です。いくつかはいくつか異なるかもしれません。 –
どちらの場合でもバイナリIEEE754表現を比較しましたか?私はそれらが同じであると仮定し、ランタイムライブラリは異なるアルゴリズムを使用して浮動小数点を文字列に変換し、異なる出力**を得るようにしています。 https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlおよびhttp://stackoverflow.com/questions/7153979/algorithm-to-convert-an-ieee-754-も参照してください。文字列を二重にする –