当前位置:   article > 正文

浮点数的规格化_1.1111111111111111111111规格化

1.1111111111111111111111规格化

看书看的很懵,然后看了很多人的文章然后现在对知识汇个总,有些地方可能错了我不知道,希望有人看到的话能指出来

浮点数的规格化与非规格化

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/258336
推荐阅读
相关标签
  

闽ICP备14008679号