我有一些代码:
float distance = pos + (screenSpeed * (float)(lastUpdateTimeMS - actualTimeMS));
该行应计算角色将移动的距离(位置的变化量,从上次检查到实际时间)。但是我发现它给出了荒谬的结果,例如对于:
screenSpeed = 0.0001f;
lastUpdateTimeMS = 106;
actualTimeMS = 106;
我得到
429497
并且公式的以下部分给了我:(float)(lastUpdateTimeMS - actualTimeMS) = 4.29497e+009
(screenSpeed * (float)(lastUpdateTimeMS - actualTimeMS)) = 429497
我得到了其他参数(
429497
总是screenSpeed
,0.0001f
和lastUpdateTimeMS
是不同的)的魔术actualTimeMS
(不是float / int范围的结尾或我熟悉的任何东西)相等,有时不相等)。lastUpdateTimeMS
和actualTimeMS
均为unsigned
类型(int
)。我知道浮点数有些不准确,但由于差异如此之大,我不明白。
我正在使用Visual Studio C ++ 2013(无论如何我都为x32构建)的x64机器上工作,我的项目包括一些库(也许有些我应该了解的构建选项,或者在
.lib
和我的代码中进行不同设置时) ,出现此类问题的结果)? 最佳答案
我知道浮点数有些不准确,但由于差异如此之大,我不明白。
首先,浮点精度与您操纵的值成比例。
其次,您在计算lastUpdateTimeMS - actualTimeMS
中将两个无符号的32位值相减时可能会出现溢出,结果接近232。然后将该值转换为float
并乘以0.0001f
,得出429497
。
换句话说,您的问题是actualTimeMS
略大于lastUpdateTimeMS
。同样,如果变量的名称是可以信任的,那么减法不应该反过来吗?
而我得到了魔术429497(这不是float / int范围的结尾或我所熟悉的任何东西)
恰好是232 * 0.0001。