类型将 log2() 的浮点值转换为整数,奇数结果


#include <stdio.h>
#include <math.h>
int main()
{
  printf("%fn", log2((unsigned)~0));       /* float size of int */
  printf("%dn", (int)log2((unsigned)~0));  /* will not convert to int */
}

这将返回 32.000000 和 31!为什么不是 32?

我稍微更改了您的程序:

printf("%.16en", log2((unsigned)~0));       /* float size of int */

它显示:

3.1999999999664098e+0131

因此,"为什么它会转换为 31"的答案是log2((unsigned)~0)介于 31 和 32 之间,因为您可以期望知道~(unsigned)0略小于 232

另一个问题是"为什么浮点数3.1999999999664098e+01打印为32.000000?答案是"你还希望它打印成什么?32.000000 是最接近实际浮点值的点后有 6 位数字的十进制表示形式。