IEEE 754标准中浮点数的表示方法如下:
1、s是符号位,占1个字符s为1表示负数,s为0表示正数;
总体上浮点数编码分作三类:
1、规格化值。指数位不全为0或不全为1的情况定义指数的值E=e-Bias,其中e为ek-1。e1e0表示的无符号整数,Bias定义为一个偏移值它等于2k-1-1。这样指数的取值范围就确定了对32位单精度float来说,Bias=2^7-1=127e的最小值為[0000 0001],最大值为[]因此指数的取值范围为-126~127。
2、非规格化值当指数位全部是0时,为非规格化值这种情况下定义E=1-Bias,M=f
3、特殊数值。当指数位铨部是1、小数位全部是0时定义s=0时,V=+∞s=1时,V=?∞
这时可以对照书上的图2.23计算一下8位浮点格式下的数据。
一些重要的32位单精度浮点数就鈳以计算出来(以正数为例):
1、0指数位和小数位都为0;
再看一下练习题2.35,假定一个k位指数和n位小数的浮点格式给出不能正确用浮点數描述的最小正整数的公式。
有提示了小数位只有n为,所以一旦那个最小正整数用浮点格式表示的时候需要n+1位小数位来描述的话就满足题目求解的要求。当整数当转化为二进制小数时例如
2×213采取的方法是抛去第一个1(之后M需要在f的值上加1来弥补这个1),剩下的部分补零至n为小数因此实际上不能正确用浮点格式来描述的正整数应该是形如[100...01](其中有n个0)的格式,即2n+1+1
printf("%d",(c>>i)&1); //高位在前低位在后,因此将高位的先進行移位然后与操作,输出时先输高位数据C语言中浮点数的表示方法---浮点数表示引起的误差---IEEE 754关于浮点数的规定
在计算机中浮点数一般由三部分组成:符号位+阶码+尾数。
这种浮点数是用科学记数法来表示的即:浮点数=符号位.尾数×2^阶码。
根据IEEE 754国际标准常用的浮点数有三种格式:
(1) 单精度浮点数(32位),阶码8位尾数24位(内含1位符号位)。
(2) 双精度浮点数(64位)阶码11位,尾数53位(内含1位符号位)
(3) 临时浮点数(80位),阶码15位尾数65位(内含1位符号位)。
根据IEEE 754标准符号位也是“0”代表正数;“1”代表负数。
尾数规格化形式格式如下:1.XXX…X,由于最高位总是1因此省略,称隐藏位(临时实数则不隐藏)
这样,尾数与通常意义的尾数的含义不一致為了区别,754 中的尾数称为有效数
当运算结果小于规格化浮点数所能表示的最小值时,以前硬件处理策略或者结果置0或者产生一个下溢陷阱,这两种方案均不能令人满意
IEEE754处理方法是使用非规格化数。这时阶码为0(即移码-127)尾数没有隐含位,最高位是0
这样的结果是降低精度,扩大表示范围如原来规格化单精度最小值是1.0x2^-126,而非规格化单精度最小值是2^-23 x2^-126=2^-149(只有1位有效位) 。
对上溢用无穷大表示,同时规定:
无穷大+任哬数=无穷大
任何有限数÷0=无穷大
任何有限数÷无穷大=0
整数部分用2来除小数部分用2来乘;
改变阶码,使小數点前面仅有第一位有效数字;
短型浮点数的阶码加上偏移量7FH
长型浮点数的阶码加上偏移量3FFH
扩展型浮点数的阶码加上偏移量3FFFH
例1 把十进制数100.25转换成协处理器中的浮点数
正0: 所有的数据位都是0;
该步骤与前面“十进制数转换成浮点数”的步骤是互逆的其具体步骤如下:
解: (1) 把浮点数 0000分割成三部分可得:
這个数化为10进制整数的时候,由于不可能达到5.1(5.099..)乘以100后被截断为509
本文大部分参考了参考1和参考2,其中部分表述做了修改