理解C中的Float

理解C中的Float,c,variables,floating-point,C,Variables,Floating Point,我无法理解c中的浮点变量,所以尝试了一些代码来检查值在控制台中的显示方式 我读了很多关于指数的文章,但没有让我满意,比如说指数是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

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

我读了很多关于指数的文章,但没有让我满意,比如说指数是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

你可以用科学记数法写任何浮点数,比如512.4,得到0.5124*10^3。这里的指数是3,尾数是5124。如果指数有8位,则可以表示n*(10^-128…10^127)。如果n是24位,那么您大概有
-2^23这是对您的一个数字10.123456的分析。二进制表示形式big-endian是0100_0001_0010_0001_1111_1001_1010_1101

最高有效位是符号位。为0,表示非负

接下来的8位,1000010,十进制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

需要了解的一些关键事项:

  • 指数中的8位偏移127。这是什么意思?这意味着,如果指数中出现值127,则实际上意味着指数在逻辑上为零。同样,如果129出现,则指数逻辑上为2,如果124出现,则指数逻辑上为-3。因此,编码的或逻辑的指数可以在-127到128之间

  • 尾数总是被假定为(根据定义)正,并且前面有一个隐式的1。所以,如果你看到10010。。。在尾数字段中,编码的数字是1.10010

  • 高位为符号位,如果为零,则编码值为正,如果为1,则编码值为负

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

  • 示例:
    您可以在内存中看到此值:
    00 00 B0 C0

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

    按符号、指数、尾数字段重新组合位数字如下:
    100000011000000000000000000

    • 前导1表示该值为负值
    • 10000001二进制是129位小数,因为格式的偏差是127,我们取129-127,得到指数2
    • 尾数01100000000000000之前有一个隐式1,因此可以将其重写为1.01100000000000000二进制
    所以编码的数字是:
    -1.011*2^2

    由于指数为正2,我们将基点向右移动2个位置。类似地,负指数会将基点向左移动其大小。我们再次改写号码:
    -101.1

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


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

    你有什么问题?你期望什么?@BryanChen我很困惑,如果指数是8位,那么小数部分之前应该只有0到255的值,但不是这样,指数可以有10万的值,但是matissa精度会发生变化,尾数部分也会发生类似的情况,为什么指数可能有256个不同的值,但(1)其中一些值用于特殊值,如infinity和NAN;(2) 指数是按比例缩放的,因此它可以表示从非常大到非常小的一系列值。查看该链接了解详细信息,它还有一个非常有用的下载工具供您学习。256个不同的指数通常是二进制指数,允许幂(2,-127)到幂(2127)(~1e-38到~1e38)的范围。24位有效位允许一定的精度。示例:在1.0和2.0之间,有幂(2,24)不同的表示形式
    float
    ——大约值7.2位小数。256和512之间的情况也是如此。257.123456对于
    float
    来说太精确了。257.123444是可用的最接近的
    float
    。指数不是小数部分,你知道吗?