在Java中向float中添加值会减慢到512

问题描述 投票:1回答:1

这一行在循环中执行:

shape.setPosX(shape.getPosX() + (.005f * (float) getDelta()));

getDelta是自上一个循环以来经过的双精度数,通常平均值为~0.001。

setPosX接受并存储浮点值。

正如您所猜测的,getPosX返回浮点值

当绘制形状时,我看到它稳定地在屏幕上移动,但是一旦X点击512,它就会减慢10倍。我可以100%重现它,所以它是一个非常大的阻挡器。

这可能会发生什么?

java floating-point floating-accuracy
1个回答
2
投票

问题是你使用的float没有足够的精度数字来表示数字。您可以通过告诉Java确定是否(512f + 0.005f * 0.001f == 512f(it is true.)来检查这一点

在32位浮点数中,对于256到512之间的值,尾数的最低有效位在.00003附近,这恰好足以让你的getDelta()推翻(这表明你假设0.001f的值平均值可能是错的)。对于512到1024之间的值,尾数的最低有效位是.00006的两倍(因为指数部分是一个)。你的getDelta会每5次左右返回一次四舍五入的东西,因此速度会减慢十倍。

你可以玩floats here

解决这个问题的方法是让你的号码成为double

有趣的琐事:浮点算术是导致Minecraft在高坐标中表现得很有趣。效果在this page中描述,尽管实际的bug可能只是整数溢出。

© www.soinside.com 2019 - 2024. All rights reserved.