【发布时间】:2015-10-16 15:23:21
【问题描述】:
我正在尝试用 Java 为游戏实现基本的 2D 矢量数学函数。它们将被游戏密集使用,所以我希望它们尽可能快。
我从整数作为矢量坐标开始,因为游戏不需要更精确的坐标,但对于所有计算,我仍然必须更改为双矢量以获得清晰的结果(例如,两条线之间的交点)。
使用双精度数时会出现舍入误差。我可以简单地忽略它们并使用类似的东西
d1 - d2 <= 0.0001
比较这些值,但我假设通过进一步的计算,错误可以总结起来,直到它变得显着。所以我想我可以在每次可能不精确的操作之后对它们进行四舍五入,但结果却产生了更糟糕的结果,假设是因为程序也会对不精确的值进行四舍五入(例如。0.33333333... -> 0.3333300...)。
使用 BigDecimal 太慢了。
解决这个问题的最佳方法是什么?
【问题讨论】:
-
如果你的游戏只有整数坐标,你一定会在某些时候失去一些精度,不是吗?但应该清楚的是,无需舍入并不是提高结果准确性的好方法。人们通常只是忍受浮点的不准确性,如果您知道自己在做什么,它就可以正常工作。如果一个数字有一点偏差,你的游戏中可能发生的最糟糕的情况是什么?
-
对于线的交叉点,这种舍入误差只对非常小的角度很重要
-
准确到什么程度才足够准确?你真的需要这种精确度吗?玩家会注意到吗?
-
我会尽可能简单地实现它,使用双精度。内置舍入是由数值近似和舍入误差专家精心设计的。您不太可能通过添加自己的舍入来改进它。
-
就像您建议的那样,使用可接受的精度级别的 epsilon 值,例如0.0001.
标签: java floating-point precision floating-accuracy