将值添加到 Java 中的浮动速度减慢到 512
Adding values to float in Java slows down at 512
这一行在循环中执行:
shape.setPosX(shape.getPosX() + (.005f * (float) getDelta()));
getDelta 是自上次循环以来经过的毫秒数,通常为 ~0.001。
setPosX 接受并存储浮点值。
getPosX,如你所料,returns浮点值
绘制形状时,我看到它在屏幕上稳步移动,但一旦 X 达到 512,它就会减慢 10 倍。我可以 100% 地重现它,所以它是一个相当大的障碍.
这里可能发生了什么?
问题是您使用的 float
没有足够的精度来表示数字。您可以通过告诉 Java 确定是否 (512f + 0.005f * 0.001f == 512f
) (it is true
.)
来检查这一点
在 32 位浮点数中,对于 256 到 512 之间的值,尾数的最低有效位在 .00003
左右,这恰好足以让您的 getDelta() 推过去(这表明您假设 0.001f
的平均值可能是错误的)。对于 512 和 1024 之间的值,尾数的最低有效位加倍为 .00006
(因为指数部分多了一个)。你的 getDelta
returns 大约每 5 次四舍五入一次,因此速度变慢 ten-fold.
你可以玩 float
s here.
解决这个问题的方法是让你的号码成为 double
。
有趣的琐事:浮点运算导致 Minecraft 在高坐标下表现得很有趣。 this page 中描述了这些影响,尽管实际错误可能只是整数溢出。
这一行在循环中执行:
shape.setPosX(shape.getPosX() + (.005f * (float) getDelta()));
getDelta 是自上次循环以来经过的毫秒数,通常为 ~0.001。
setPosX 接受并存储浮点值。
getPosX,如你所料,returns浮点值
绘制形状时,我看到它在屏幕上稳步移动,但一旦 X 达到 512,它就会减慢 10 倍。我可以 100% 地重现它,所以它是一个相当大的障碍.
这里可能发生了什么?
问题是您使用的 float
没有足够的精度来表示数字。您可以通过告诉 Java 确定是否 (512f + 0.005f * 0.001f == 512f
) (it is true
.)
在 32 位浮点数中,对于 256 到 512 之间的值,尾数的最低有效位在 .00003
左右,这恰好足以让您的 getDelta() 推过去(这表明您假设 0.001f
的平均值可能是错误的)。对于 512 和 1024 之间的值,尾数的最低有效位加倍为 .00006
(因为指数部分多了一个)。你的 getDelta
returns 大约每 5 次四舍五入一次,因此速度变慢 ten-fold.
你可以玩 float
s here.
解决这个问题的方法是让你的号码成为 double
。
有趣的琐事:浮点运算导致 Minecraft 在高坐标下表现得很有趣。 this page 中描述了这些影响,尽管实际错误可能只是整数溢出。