有可能的方法可以将两个从无符号 int 铸造的浮点数除以产生负浮点数结果

There are possible way of dividing two float numbers which was casted from unsigned int make negative float result?

本文关键字:浮点数 int 结果 无符号 两个 方法 有可能      更新时间:2023-10-16
unsigned int deltaTime = now() - last();
unsigned int freq = getFreq();
float timeOfGap = float(deltaTime) / float(freq);
ASSERT(0.0f <= timeOfGap, "WHAT?");

我从我的程序中得到了一个非常奇怪的结果。我没有捕捉到发生的一幕。但我有一份日志,上面写着至少提高了多次。

有可能的方法可以在两个从无符号 int 铸造的浮点数之间划分,从而产生负浮点数结果?


好的,谢谢你们。我很高兴看到你的关注。让我尝试添加一些关于它的描述。这对你会有所帮助。

我正在为一个在线游戏工作,这种情况很少但经常被提出,而游戏服务了数亿次。我无法调试或捕获确切的镜头,但它记录在数据库错误消息中。

正如您所注意到的,timeOfGap 应该是 NaN,但日志并没有完全提醒该值。差距的时间累积如下;

mTotalFrameRateTimeAsASecond += timeOfGap;

这个程序记录mTotalFrameRateTimeAsASecond,这是一个负值。但除了这个价值符号是负数之外,它是正确的价值。意思是,如果我将最终值除以帧速率,它指出时间看起来一样好。假设的播放时间为 500 秒,它是 -30000(每秒 60 帧率)。

也许它不是负面的,而是NAN. 0.0f <= NANfalse.如果两个操作数都为零,则可能会发生这种情况。

这应该找到问题:

unsigned int deltaTime = now() - last();
unsigned int freq = getFreq();
float timeOfGap = float(deltaTime) / float(freq);
char s[50] ;
sprintf (s, "WHAT? %u/%u < 0!", deltaTime, freq);
ASSERT(0.0f <= timeOfGap, s);

nan的值不会成功与任何值进行比较。因此,如果您有:

float f = 0.0 / 0.0;
assert(f > 0 || f <= 0);

断言将失败!

您可以执行一个简单的测试来验证从无符号 int 到浮点数的转换。

试试这个:

unsigned int toto = 0xFFFFFFFF; 
float convertedToto = float(toto);

如果转换(无符号 int -> 浮点数)实际上是(int ->浮点数),则convertedToto等于 -1。您应该通过适当的转换获得 2*10e31。