赞
踩
看书看的很懵,然后看了很多人的文章然后现在对知识汇个总,有些地方可能错了我不知道,希望有人看到的话能指出来
浮点数的规格化与非规格化
IEEE754规定的32位浮点数的组成是,1位数符,8位阶码,23位尾数。对于64位的浮点数,1位是数符,11位阶码,52位尾数。
关于浮点数的阶码:
IEEE754规定,E(真实的指数位)=P(阶码段中的值)-b(偏移值),其中偏移值b=2^(k-1)-1,其中k为阶码的位数。
IEEE754表示的规格化的32位浮点数阶码范围是00000001-11111110,即1-254,去掉偏移值127后真值即为[-126,127]。
对于64位的规格化浮点数的阶码范围是00000000001-11111111110,即1-2046,减去偏移量1023后真值为[-1022,1023]。
规格话的浮点数的阶数不能为全0或者全1,上网搜了搜,当阶码E为全0且尾数也为全0时,表示的真值x为零,结合符号位S为0或1,有正零和负零之分。当阶码E为全1且尾数M为全0时,表示的真值x为无穷大,结合符号位S为0或1,也有+∞和-∞之分。不能为全0和全1则除去表示零和无穷大的特殊情况
在非规范化时,32位浮点数阶码的取值范围是00000000-11111111,即0-255,64位浮点数取值范围位00000000000-11111111111,即0-2047。(我对这里其实还是搞不懂,像255,减去偏移量的话是128,可是原码的表示范围是-127-127,补码的表示范围是-128-127,这俩都没128,所以这给非规格化的范围是错的吗???有人能给我解答一下吗)
关于浮点数的规格化尾数(以下均为二进制的):
m为尾数的位数,小数点前的是符号位
对于原码:当尾数M>=0时,尾数的规格化格式是0.1XXXX,范围从0.100…0-0.111…1,真值即[1/2,1-2^(-m)]。当尾数M<0,尾数的规格化格式是1.1XXXX,范围从1.11…1-1.100…0,真值即[-(1-2^(-m)),-1/2]。
总结就是尾数最高位必须为1。
对于补码:当尾数M>=0,尾数的规格化形式:M=0.1XXXX,范围从0.10…0-0.11…1,真值即[1/2,(1-2^(-m))]。当尾数M<0时,尾数的规格化形式:M=1.0XXXX,范围从1.00…0-1.011…1,真值即[-1,-(1/2+2^(-m))]
总结就是符号位需要与尾数最高位相反。
总的规格化格式:
(-1)^S*1.f*2^E
其中S为符号位,f为舍弃了尾数最高位的尾数原码(根据原码的规格化方法,最高数字位总是1,该标准将这个1缺省存储,使得尾数表示范围比实际存储的多一位),E为阶码。IEEE754浮点表示法尾数用原码表示,阶码是用移码表示,即原码加上偏移量(对补码符号位取反得出原码仅仅适用于偏移量是2^(n-1)的情况,但是IEEE754规定偏移量的是2^(n-1)-1,上网搜的)。
IEEE754浮点数的表示范围
正数
格式 | 最小值 | 最大值 |
单精度 | E=-126,f=0,1.0*2^(-126) | E=127,f=1.111…1,(2-2^(-23))*2^127 |
多精度 | E=-1022,f=0,1.0*2^(-1.022) | E=1023,f=111…1,(2-2^(-52))*2^1023 |
负数
格式 | 最大值 | 最小值 |
单精度 | E=-126,f=0,-1.0*2^(-126) | E=127,f=1.111…1,-(2-2^(-23))*2^127 |
多精度 | E=-1022,f=0,-1.0*2^(-1.022) | E=1023,f=111…1,-(2-2^(-52))*2^1023 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。