私のコードは、タスクを解決するために(ゲームロジックティックで)二次方程式を解きます-空間内の可動オブジェクトの軌道に沿って衛星ティックオフセットを見つけます。また、判別式 (さらに遠いD
) の計算でエラーが発生しました。思い出させます: D = b^2 - 4ac
. 大きな天体の軌道なので、 my a
、b
&c
は次のような次数です。
1E+8
1E+12
1E+16
したがって、b^2
注文数は約1E+24
、 &4ac
も約1E+24
です。しかし、この方程式の根ははるかに少ない数値です。なぜなら、それらはシーン上の座標にすぎないからです。だから根は約1E+3 ... 1E+4
です。
問題(更新 - 具体化):b^2
float(およびdouble)の値が浮動し4ac
ているため、十分に小さい不正確さがあります(これらの非常に大きな数に比べて[測定された絶対的な不正確さは約です1E+18
])、しかしD
==の違いとしてその中で、D
(大きな値側から)が前述の不正確さである(1E+18
)のオーダーの値になると、その値は約範囲で変動し始めます+1E+18 .. -1E+18
(つまり、変動幅は実際の[-100%.. +100%]よりも広いです)価値!
明らかに、この変動は間違った (間違った方向の) ティック オフセットを引き起こします。そして、私の衛星はぐらつき始めます(そしてそれはひどいです))。
注:「いつD
ゼロに近づいているか」と言ったとき、実際にD
はまだゼロから十分に離れているため、この範囲の値でゼロに割り当てることはできません。
固定小数点計算を使用することを検討しました (これにより、問題から救われる可能性があります)。ただし、tick ロジックでの使用は推奨されていません (最適化されておらず、おそらく非常に遅くなるからです)。
私の質問:どうすれば問題を解決できますか? 私の場合、いくつかの一般的な解決策があるでしょうか?アドバイスありがとうございます!
PS: すべての数式は適切です (コード内のフロートが失敗したときに、すべてを Excel で計算して適切な結果を得ました)。
PPS: float の代わりに double を試しました (すべての計算ではありませんが、私のa
, b
&c
は現在 double です) & 問題は消えませんでした。
更新:a
間違えました - 、b
&の順序の混乱した順序c
。では、「b^2
は についての注文数1E+16
、 &4ac
は について1E+28
」 が間違っていました。これで両方に修正され1E+24
ました。(私はすでに書かれたコメントにこれを書いたが理解できた)
更新#2:「問題」セクションが具体化されました。
更新#3:値の実際のケース(参照用):注:ここでは「正確な値」として、Excelで手動で計算された値をマークしています。
a == 1.43963872E+8
b == 3.24884062357827E+12
c == 1.83291898112689E+16
//floats:
b^2 == 1.05549641E+25
4ac == 1.05549641E+25
D == 0.0
root:
y = -1.12835273E+4
//doubles:
b^2 == 1.0554965397412443E+25
4ac == 1.0554964543412880E+25
D == 8.5399956328598733E+17
roots:
y1 == -1.1280317962726038E+4
y2 == -1.1286737079932651E+4
//accurate values:
b^2 == 1.05549653974124E+25
4ac == 1.05549645434129E+25
D == 8.53999563285987E+17
roots:
y1 == -1.128031796E+4
y2 == -1.128673708E+4
double で OK のように見えますが、そうではありません。ここでは計算の一部のみを示しています。ここでは、同じ a、b、c の値から開始しますが、コード内の実際の値も計算されます。また、不正確さが含まれているため、doubles でも問題が発生します。