避免浮点精度问题

时间:2012-03-20 13:42:00

标签: c# .net floating-point

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

这需要将浮点数限制为2个数字的“后点精度”。 在点之后保持2个数字的精度有什么好方法?

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

更多信息

我不是在谈论空间(我知道浮动需要多少空间,真的),我正在谈论当我的浮动点将会有松散精度的问题小数点后的许多数字。

使用int会导致我每帧都将int转换为浮点数。我不知道转换的速度有多快,但在为很多对象执行此操作时,这似乎会花费很多性能。 (记得我在移动设备上)。

当然我也不是在谈论地形,我在谈论地形中的物体!地形是一个专门的系统,实际上可以保持地形大小延伸浮动的极限很多(当你有足够的磁盘空间时,甚至可以在这个系统中保存北美,但实际上限制设置为-99km到+ 99km)。

编辑2

通常在游戏中,运动是基于时间的,意味着我需要将对象的速度乘以统一给我的修饰符,这会破坏我的数字,小数点后限制为2个数字。

2 个答案:

答案 0 :(得分:1)

一种有趣的方法是将其实现到运动功能中:

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语句并让它无条件地消除了模数,因为它无论如何都会完成。

答案 1 :(得分:0)

嗯,无论你选择什么样的精度,他们仍然占用相同的空间。单身或双人会有所不同,但你应该问的真正问题是你是否需要浮点数。如果你可以在int中拟合数字,那就这样做。