float在计算机中的存储及精度和取值范围

1、float在计算机中的存储

首先我们知道常用的十进制科学计数法是将所有的数字转换成(±)a.b x 10c 的形式,其中a的范围是1到9共9个整数,b是小数点后的所有数字,c是10的指数。
而计算机中存储的都是二进制数据,所以float存储的数字都要先转化成(±)a.b x 2c ,由于存储为二进制分数的尾数大于或等于 1 且小于 2,对于 float类型,最高有效位位置的尾数中有一个隐含的前导 1,这样,尾数实际上分别为 24 位长,即使最高有效位从未存储在内存中也是如此。所以表示法可以写成(±)1.b x 2c 的形式,float要想存储小数就只需要存储(±),b和c就可以了。

float浮点数在计算机内用指数型式表示,分解为:符号位,尾数部分,指数部分。

  • Sign(1位) 符号位:占 1 位二进制,表示数的正负。
  • Mantissa(23位) 尾数部分:表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点,即上文中b。
  • Exponent(8位) 指数部分:即上文中提到的c;由于指数是以无符号形式存储的,因此指数的偏差为其可能值的一半。对于 float 类型,偏差为 127
    1、由实际值计算出二进制指数型数据,获得的 c+127,即是指数部分在计算机中存储的值;
    2、计算机存储的指数部分-127,即是实际值的二进制指数型数据的指数。
  • 指数占多少位,尾数占多少位,由计算机系统决定。
  • 以下是float在内存中的存储(测试数据是0.15625):
    在这里插入图片描述

计算

  • 0.15625转化为二进制为0.00101,转化为二进制指数型数据:1.01 x 2-3 ,即指数在内存中存储值为 -3+127 = 124——>0111 1100;尾数部分:0100 0000 0000 0000 0000 000;因为0.15625是正值,所以符号位为0。在内存中的表示如上图所示
  • 内存中的float值转化为二进制实际值: 由于0111 1100 = 124,则二进制指数部分为124-127 = -3,尾数部分为1.01(最高有效位位置的尾数中有一个隐含的前导 1,不存于实际内存中,所以取出尾数的时候要加上前导1),符号位为0,即可得二进制实际值为(1.01 x 2-3)2 = (0.15625)10

你可能感兴趣的:(c++,C语言,c语言,c++)