我的代码求解二次方程(在游戏逻辑刻度中)以解决任务 - 沿着空间中可移动物体的轨道找到卫星刻度偏移。而且我在判别(更远D
)计算中遇到了错误。我会提醒:D = b^2 - 4ac
。因为它是大物体的轨道,所以 mya
和b
&c
是顺序数,例如:
1E+8
1E+12
1E+16
因此,b^2
订单数约为1E+24
, &4ac
也约为1E+24
。但是这个方程根的数字要少得多,因为它们只是场景中的坐标。所以根是关于1E+3 ... 1E+4
。
问题(更新-具体化):由于浮点数(和双精度)的值浮动b^2
&4ac
有不准确性,这足够小(相对于这些非常大的数字[测量的绝对不准确性有大约1E+18
]),但是D
==差异其中,当D
is(从较大的值一侧)到所提到的不准确的顺序值是1E+18
(+1E+18 .. -1E+18
价值!
显然,这种波动会导致错误的(甚至是错误的定向)刻度偏移。我的卫星开始摇晃(这很糟糕))。
注意:当我说“何时D
接近零”时,实际上D
离零还很远,所以我不能在这个值范围内将它分配给零。
我考虑过使用定点计算(这可以使我摆脱问题)。但是,不建议在滴答逻辑中使用(因为它们的优化程度要低得多,而且可能会很慢)。
我的问题:我该如何解决我的问题?我的情况可能有一些常见的解决方案吗?非常感谢您的任何建议!
PS:所有公式都很好(当我的代码中的浮点数失败时,我在 excel 中计算了所有并得到了正确的结果)。
PPS:我尝试了双精度浮点数(不是所有计算,但我的a
, b
&c
现在是双精度数)& 问题并没有消失。
更新: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
双打看起来不错,但不是,因为这里我只给出了部分计算 - 这里我从相同的 a、b 和 c 值开始,但它们在我的代码中的实际值也被计算出来。并且包含不准确性,即使使用双打也会产生问题。