避免浮点精度问题

本文关键字:精度 问题 | 更新日期: 2023-09-27 18:28:35

我即将为一款手机游戏创建一个地形,它允许一个巨大的地形,而这个地形主要受到可用硬盘空间的限制。

这需要保持浮点被限制为"0";点后精度";共2个数字。有什么好的方法可以让它保持在点后2个数字的精度?

请记住:我在移动设备上运行,因此该方法应该快速易用,并且应该适用于游戏所需的任何算法。

更多信息

我说的不是空格(我知道一个浮点需要多少空格,伙计们,真的),我说的是当我的浮点在小数点后有很多数字时,我会失去精度的问题。

使用int会导致我必须在每帧中将int转换为float。我不知道转换的速度有多快,但在对很多对象进行转换时,这似乎会消耗很多性能。(记住我在移动设备上)。

当然我也不是在谈论地形,我是在谈论地形中的物体地形是一个专门的系统,它实际上可以容纳一个大大扩展漂浮物限制的地形大小(当你有足够的磁盘空间时,甚至可以在这个系统中拯救北美,但实际上限制设置为-99km到+99km)

编辑2

和往常一样,在游戏中,移动是基于时间的,这意味着我需要将物体的速度与给我的修改器相乘,这会破坏我的数字,这些数字限制在小数点后的2个数字内。

避免浮点精度问题

一个有趣的方法是将其实现到移动函数中:

float result = //multiply force by time
float modulus = result%0.01f;
result -= modulus; //you will do this in any case
if(modulus>=0.005f) {/*round up. if you want it to only round down, remove
  the next 2 lines, if you want it to only round up, remove
  the conditional statement*/
  result+=0.01f; }

我想不出如何进一步优化它,我删除了else语句,并让它无条件地去掉模量,因为无论如何都会这样做。

嗯,无论你选择何种精度进行操作,它们仍然占用相同的空间。单点或双点会有所不同,但你应该问的真正问题是你是否需要浮点。如果你能把这些数字放在一个int中,那就这样做。