在C中表示浮动

时间:2010-07-17 13:10:09

标签: c floating-point

我试图使用此代码了解C中的浮点表示(我的机器上floatint都是4个字节):

int x = 3;
float y = *(float*) &x;
printf("%d %e \n", x, y);

我们知道x的二进制表示将是以下

00000000000000000000000000000011

因此,我希望y能够表示如下

  • 符号位(左起第一位)= 0

  • 指数(左起第2-9位)= 0

  • 尾数(第10-32位):1 + 2^(-22)+2^(-23)

通往y = (-1)^0 * 2^(0-127) * (1+2^(-22) + 2^(-23)) = 5.87747E-39

我的程序打印出

3 4.203895e-45

也就是说,y的值为4.203895e-45,而不是我预期的5.87747E-39。为什么会这样呢?我做错了什么?

P.S。我还直接从gdb打印了值,因此printf命令没有问题。

3 个答案:

答案 0 :(得分:12)

指数字段为全0的IEEE浮点数是“非规范化的”。这意味着尾数前面的隐含1不再有效。这允许表示真正的小数字。见This wikipedia article for more explanation。在您的示例中,结果将是3 * 2 ^ -149

答案 1 :(得分:6)

指数中的

-127保留用于非规范化数字。您的计算是针对规范化数字,而您的浮点数是非规范化浮点数。

非规范化数字是使用类似方法计算的,但是:

  1. 指数为-126
  2. 不再假设隐式前导位
  3. 所以这意味着计算是:

    (-1)**0*2**(-126)*(2**(-22)+2**(-23)) = 4.2038953929744512e-45
    

    以上是python,其中**^

    相同

答案 2 :(得分:1)

详细说明http://en.wikipedia.org/wiki/IEEE_754-2008 此标准假设您向左移动尾数直到隐藏第一个含义位(增加指数)。在你的情况下你有表达式1 + 2 ^( - 23) - 然后你得到正确答案4.9..E-32