计算机组成原理:IEEE754标准中,为什么指数真值e变成阶码加上的偏移值是127不是128?

1.浮点数在计算机里的存储方式

以32位为例,短浮点型float,按照按照 IEEE754 标准,在计算机里的存储格式如下
在这里插入图片描述
数符S:表示浮点数的符号,占1位,0—正数、1—负数;
尾数M:23位,原码纯小数表示,小数点在尾数域的最前面;
阶码E:8 位,采用有偏移值的移码表示;
移127码,即E=e+127,E的8位二进制数即为移127码的编码;
浮点数的真值:N=(-1)S×(1.M)×2^(E-127)\

2,按照移码的定义,k位原码的移码应该是: 真值+2^(K-1) 那么8位阶码应该是加128才对.那为什加的是127呢?

首先,我们知道移码是真值的一种去符号话的表示,阶码之所以用移码是因为移码值大的指数就大,通俗点就是把负数范围的数变成正数,方便比较.

规格化
对于将某个实数表示为计算机浮点数,首先要将其正规化,也就是表示为形如:在这里插入图片描述

的样子。其中b是0或1,而p二进制数表示的指数位。这样,假设想表示为单精度(float)的浮点数,那么:
第一位符号位用0表示正,用1表示负
将指数p加上移码表示为8位的二进制数
在接下来的23位填充位数b部分。由于正规化表示时,最左边部分总是1,所以我们只需表示23位的尾数即可.

所以,在规格化表示中8位移码理论上可以表示的表示范围为0~ 255,但是IEEE754中又规定,当阶码为00000000,尾数也为0的时候表示真值为0,结合S符号位,有正0和负0之分;而当阶码为11111111,尾数为0时,表示真值为无穷大,结合S符号位,有正无穷大和负无穷大,但是为了在规格化的浮点数中规避掉这种情况,所以将偏移值选择127,而不选128;这样阶码就变成1~ 254,对应的指数值就为-126~127;这也就解释了为什么偏移值要选择127,而不选择128的原因了.

那么问题来了,既然把那些特殊值给规避掉了,那么他们该如何表示呢?
在这里插入图片描述

按照上面的浮点数表示方法,我们发现并不能表示出数值0的大小。因为我们认为前导数位的值永远为0,这个时候无论尾数的小数部分和指数部分怎么取,浮点数的值都不会是0。为此我们规定,当阶码全部为0且尾数的小数位全为0时,这个时候浮点数的值为0。注意,+0和-0时两个不同的浮点数,即使他们的数值一样,但是浮点数的表示方式不一样。

非标准化的值
当指数部分全为0,但时小数位不全为0的时候,这个时候浮点数表示的值就是非标准化的值。这个时候我们认为该浮点数的前导数位为0,因此这个时候的单精度浮点数大小为(−1)^s × 0.M × 2 ^−126,具体原因可以这样理解,非标准化可以看做是标准化的特殊情况,这时候阶码去0,但是因为是非规格化,所以不是默认隐藏了一位1,可以看成规格化还要向右移动一位.所以,指数就变成了126,其实非规格化就是在规格化的基础上扩展了精度.

无穷大
当指数位全为1,而尾数的小数部分全为0时表示+∞和−∞,同时通过符号位来区分+∞和−∞。所以采用IEEE 754标准表示浮点数可以很好的处理无穷大的情况。

非数字(NaN)
NaN(Not a Number)用来表示非数字的值,当指数位全为1且尾数的小数部分不为0时表示NaN值。一共有两类NaN值,静态非数(QNaN, Quiet NaN)和警告非数(SNaN, Signalling NaN)。当阶码为255时尾数不为0的时候,表示的数值就为NaN,
他的目的就是让程序员能够退持进行测试和判断的时间
.

补充一点,虽然说java中, float类型占4个字节但是它表示数的范围从2^-126~2 ^127,而long类型占8个字节,其取值范围为long的最大值有符号是 2 ^63-1,无符号是2 ^64-1,因此float类型要比long类型表示范围大得多,因为float是存储的指数,而long类型是直接存放数的二进制原码.

  • 61
    点赞
  • 198
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值