c语言浮点数表示方法中的计算问题

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

1、将十进制数转换成二进制数:

整数部分用2来除小数部分用2来乘;

改变阶码,使小數点前面仅有第一位有效数字;

短型浮点数的阶码加上偏移量7FH
  长型浮点数的阶码加上偏移量3FFH
  扩展型浮点数的阶码加上偏移量3FFFH

4、以浮点数据格式存储

  把数值的符号位、阶码和尾数合在一起就得到了该数的浮点存储形式。

例1 把十进制数100.25转换成协处理器中的浮点数


幾个特殊数据的存储规则:

正0: 所有的数据位都是0;

该步骤与前面“十进制数转换成浮点数”的步骤是互逆的其具体步骤如下:

1、分割数芓的符号、阶码和有效数字;2、将偏移阶码减去偏移,得到真正的阶码;3、把数字写成规格化的二进制数形式;4、把规格化的二进制数改變成非规格化的二进制数;5、把非规格化的二进制数转换成十进制数

例2 把浮点数0000转换成十进制数。

解: (1) 把浮点数 0000分割成三部分可得:


這个数化为10进制整数的时候,由于不可能达到5.1(5.099..)乘以100后被截断为509

本文大部分参考了参考1和参考2,其中部分表述做了修改

我要回帖

更多关于 c语言浮点数 的文章

 

随机推荐