有可能的方法可以将两个从无符号 int 铸造的浮点数除以产生负浮点数结果
There are possible way of dividing two float numbers which was casted from unsigned int make negative float result?
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 <= NAN
是false
.如果两个操作数都为零,则可能会发生这种情况。
这应该找到问题:
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。
相关文章:
- 使用 int 指针的浮点数的位表示形式
- 将浮点数除以 int 总是给出浮点数吗?C++
- 为什么 int 和浮点数的总和是 int?
- 使用按位 AND 和 popcount 而不是实际的 int 或浮点数乘法进行大 (0,1) 矩阵乘法
- 将 int 128 除法提升为浮点数
- 将大 int 转换为浮点数,而不舍入 c++
- 在 UDP 套接字上发送结构、浮点数和 int C++
- 给定一个整数 M,使得 (int)C < M 的最大浮点数 C 是多少?
- 将浮点数转换为 int,带和不带强制转换
- 将浮点数转换为 int,或将 int 强制转换为浮点数
- 如何将数组的一部分从 int 转换为浮点数并将值设置为另外两个数组
- 如何获取模板的类型,如模板<类型名 T>,并检查 T 是 int 还是浮点数或类
- 从无符号 int 转换为浮点数时出错
- 为什么浮点数和 int 具有如此不同的最大值,即使它们是相同的位数?
- 如何将转换 int 除法键入为浮点数
- 将 int 转换为浮点数
- 为什么int指针会给我一个浮点数
- c++将两个浮点数相除得到int
- 在c/++中将浮点数转换为两个int
- 将 Object int 数据成员转换为浮点数并划分会将奇怪的数据 cout 附加到控制台