我有一些代码:

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总是screenSpeed0.0001flastUpdateTimeMS是不同的)的魔术actualTimeMS(不是float / int范围的结尾或我熟悉的任何东西)相等,有时不相等)。

lastUpdateTimeMSactualTimeMS均为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。

08-16 07:41