了解C中的Float

时间:2014-07-10 04:06:23

标签: c variables floating-point

我无法理解c中的float变量,所以尝试了一些代码并检查控制台中值的显示方式,

我读了许多关于但没有满足我的文章http://www.cquestions.com/2011/02/memory-representation-of-float-data.html说指数是8位而尾数是24位,但是如果是这样那么指数部分应该在0到256之间变化或者我感到困惑。请帮助我学习这个

void main()
{
  float f="different values below";
  printf('float value is : %f',f);
}

 tried values for f    console output
257.123456              257.123444
256.123456              256.123444
128.123456              128.123459
100.123456              100.123459
10.123456                10.123456

3 个答案:

答案 0 :(得分:1)

这是对你的一个号码的分析,10.123456。二进制表示,big-endian,是0100_0001_0010_0001_1111_1001_1010_1101

最重要的位是符号位。它为0,表示非负数。

接下来的8位,10000010,十进制130,是指数。它以超过127的形式存储,因此有效指数为130-127 = 3.

对于正常数字,有效数字的形式为1.x,其中x是最后的23位。 1未存储。您的有效数字是1.010_0001_1111_1001_1010_1101。

调整基数2指数为3时,变为1010.0001_1111_1001_1010_1101。二进制点之前的1010对应于小数点前的10。分数部分是129453 /(2 ^ 20)= 0.12345600128173828125。您的浮点数的精确值(十进制)为10.12345600128173828125

答案 1 :(得分:0)

你可以用科学记数法写任何浮点数,例如512.4,得到0.5124 * 10 ^ 3。这里的指数是3,尾数是5124.如果指数有8位,那么你可以表示n *(10 ^ -128 ... 10 ^ 127)。如果n是24位,那么你大概有-2^23 <= n <= 2^23。实际上计算机使用的是基数2而不是10,但这个想法是一样的。

此外,由于您使用的是base 2并且位数有限,因此您无法以二进制形式表示所有可能的浮点数。这就是输入和输出在某些(大多数)情况下不同的原因。

答案 2 :(得分:0)

要理解的一些关键事项:

  1. 指数中的8位偏向127.这是什么意思?这意味着如果值127出现在指数中,则实际上意味着指数在逻辑上为零。类似地,如果出现129,则指数在逻辑上为2,如果出现124,则指数在逻辑上为-3。所以编码或逻辑指数的范围可以从-127到128。

  2. 总是假定尾数(并且根据定义)是正的,并且前面有一个隐含的1。因此,如果您在尾数字段中看到10010 ...,则编码的数字为1.10010。

  3. 高位是符号位,如果它为零则编码值为正,如果为1则编码值为负。

  4. 格式中包含许多特殊值,不适合此模式。例如,零值方便地由每个字段中的所有零比特表示。 NaN(非数字)和无穷大有特殊值。还有非常规的特殊编码,这些是零和最低可表示指数-127之间的值。

  5. 例:
    你在内存中看到这个值:
    00 00 B0 C0

    它是一个小端系统,所以它代表这个十六进制值:
    0xC0B00000
    和这个二进制值:
    1100 0000 1011 0000 0000 0000 0000 0000

    按符号,指数,尾数字段重新组合数字,数字如下:
    1 10000001 01100000000000000000000

    • 前导1表示该值为负数。
    • 10000001二进制为129十进制,因为格式为127的偏差我们取129到127并得到指数为2.
    • 在尾数01100000000000000000000之前有一个隐含的1,所以可以重写1.01100000000000000000000二进制

    所以编码的数字是:
    -1.011 * 2 ^ 2

    由于指数为正2,我们将小数点向右移动2位。同样,负指数会将小数点向左移动。我们再次重写这个数字:
    -101.1

    现在让我们将其转换为十进制:

    - (1 * 4 + 0 * 2 + 1 * 1 + 1 *(1/2))= -5.5