[英]Adding values to float in Java slows down at 512
该行正在循环执行:
shape.setPosX(shape.getPosX() + (.005f * (float) getDelta()));
getDelta是自上一个循环以来经过的毫秒数,为两倍,通常平均为0.001。
setPosX接受并存储浮点值。
如您所料 , getPosX返回浮点值
绘制形状时,我看到它稳定地在屏幕上移动,但是一旦X达到512,它就会减速10倍。我可以100%地复制它,因此它是一个很大的障碍物。
这可能是怎么回事?
问题是您使用的float
没有足够的精度数字来表示该数字。 您可以通过告诉Java确定是否( 512f + 0.005f * 0.001f == 512f
)来进行检查(确实true
。
在32位浮点数中,尾数介于256和512之间的最低有效位约为.00003
,这恰好足以使getDelta()推入(这表明您假设该值的平均值为0.001f
可能是错误的)。 尾数的最低有效位(介于512和1024之间)的值加倍至.00006
(因为指数部分又多了)。 您的getDelta
返回的结果每5次左右会四舍五入一次,因此速度降低了十倍。
你可以在这里玩float
。
解决的办法是使您的人数double
。
趣味问答:浮点运算是导致Minecraft在高坐标下表现出有趣的行为。 尽管实际的错误可能只是整数溢出,但在本页中描述了效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.