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

时间:2015-12-05 18:59:38

标签: floating-point

#include <stdio.h>
#include <math.h>

int main()
{
  printf("%f\n", log2((unsigned)~0));       /* float size of int */
  printf("%d\n", (int)log2((unsigned)~0));  /* will not convert to int */
}

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

1 个答案:

答案 0 :(得分:1)

我稍微改变了你的程序:

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

它显示:

3.1999999999664098e+01
31

所以“为什么它转换为31”的答案是log2((unsigned)~0)介于31和32之间,因为你可以预期知道~(unsigned)0略小于2 32

另一个问题是“为什么浮点数3.1999999999664098e+01打印为32.000000?”。对此的答案是“你还有什么喜欢打印的? 32.000000是最接近的十进制表示,点后6位数与实际浮点值。“