消除浮点舍入错误的技巧?

时间:2018-12-30 23:33:43

标签: java rounding

首先,让我开始说,我知道没有办法避免舍入错误。我的问题在于如何舍入错误并进行修正。您可能会问:“为什么重要?”。在我的一个Java项目中,我使用了“分离轴定理”来实现对运动对象的碰撞检测/解决,并且效果很好,但是我一直遇到一个缺陷...

舍入错误

我拍了一张照片以帮助说明我在说什么: SAT Collision Resolution

以上是我在Java项目中如何解决冲突的方法。让我展示一下在这种情况下舍入错误会带来什么问题。

SV = MV.scale(2f(distance)/3f(move length))

2f / 3f = 0.666666667(大约打印2/3时将显示的内容) 0.666666667非常糟糕,因为它实际上导致比例过大 0.000000001比例尺太大,这意味着SV会比预期的大,从而导致在碰撞解决后它几乎不能夹成其他形状。是的,它是如此之小,以至于人类无法察觉,但确实确实会造成削波,无论它有多小,因此我认为这是一个失败的碰撞解决方案。

到目前为止,我的工作解决方案一直是这样的

MV.scale((int)(2f/3f)*10000f)/10000f)

虽然这可能对我将使用其算法的所有应用程序都有效,但是精度损失以及在高数字时最终可能会中断(由于浮点数的性质会导致精度损失),这使得很难接受。通过算法选择0.666666665(或接近它的值)不会有问题,但是我找不到找到与数字的下一个最接近浮点数的算法(如果存在,我会警惕性能下降)。

有什么想法或替代策略吗?我有点机智在这里结束。预先感谢!

0 个答案:

没有答案