为什么阶码的偏移量选择用127而不用128?
2013-03-28 15:49
141 查看
在IEEE754标准中,为什么阶码的偏移量选择用127而不用128?
2011-04-01 21:53 maxlwc | 分类:汇编语言 | 浏览1703次本人清楚IEEE754标准是使用127作为偏移量,但是不明白他为什么选127。原来移码中,正常8位移码,通常偏移量是128。IEEE754为何不选用128作为偏移量。选127比选128有何优势?希望有这方面的牛人能一解我的困惑。
我来帮他解答
提问者采纳
检举| 2011-04-04 01:12
因为ieee754的尾数部分标准化后首位的1会隐藏掉。 比如8是2的3次,不算隐藏为位的话,阶码是3的移码131,但有隐藏位后,尾数部分全部左移一位,阶码减1变成130,并且把尾数的首位数字1隐去。为方便记忆直接称为127移码。
追问
谢谢,不过你的这个理解是错的:你的观点是因为尾数的隐藏位造成了指数偏移量不是128而是127。换句话说假如使用128作为偏移量,不使用隐藏位所算出的阶码值应该等于使用127作为偏移量,使用隐藏位所算出的阶码值。现在我就来模拟计算下(n为数符,e为指数,s为尾数):(1)偏移127,首先将8转化为n=0,e=3,s=1.0,然后再将3+127=130。(2)偏移128,首先将8转化为n=0,e=4,s=0.1,然后再将4+128=132。由计算可见两者不相等。
回答
我来打个比方 如果将e=3看做函数的参数,移码130看做函数的返回值那你计算出来的132是什么呢 函数如下 int f(int e) { e=e+128; // 变为移码 e=e-1; //减小1 return e; } 3和4作为输入返回值是130 ,和131,你求到中间步骤当然结果不对,人们就是为了简单才把两个步骤合起来的,你要还原过程就把步骤做全。
追问
可能是我没说清楚,我来按照你的思路模拟一遍:(1)8=0.1乘以2的4次方 (2)将4以128为偏移量求阶码,阶码求出为132 ,注意此时尾数为0.1(3)然后将尾数左移一位,尾数变为1.0,此时阶码减去1,即132-1=131。发现没有,算出来的阶码最终结果是131而不是130,可见并不是因为隐藏位才将128的偏移量改为127。我原来对这个问题的理解和你是一样的,所以对这个思路我是比较清楚错在哪里的。你再好好考虑下,非常感谢你的回答。
回答
标准化的表示法是唯一的,即隐藏位必须是1。 8=0.1乘以2的4次方,尾数部分要移动两次,才是标准化写法。 8的标准化后阶码130,尾数部分包含隐藏位的前4位是1000 132对应的尾数前4位是0010。是不是和你想的不同? 因为只存在标准化小数到机器码的一个公式,小数只有变成1.s 2^e 这种形式才能使用公式。非标准化小数不能套用这个公式
追问
我很认真看了你的回答。8=0.1乘以2的4次方,此时尾数部分隐藏位为0;在尾数部分左移一位以后8=1.0乘以2的3次方,此时尾数部分隐藏位为1。不知道你为什么会理解成“尾数部分要移动两次”。 而且,最关键的一点,使不使用隐藏位只会影响指数的实际值(比如,此处我们谈论的2的3次方或者是4次方),而不会影响指数的偏移量,偏移量只是移码的一种计算手段。还有我如果追问超过3条要消耗财富值了。我们可以加好友探讨下这个问题。
回答
尾数部分包含隐藏位的话,小数点在第二位之后,10.00 130 和00.10 132 请实际算一下。 另一个问题的话,我问过别人,答案是尾数左移和阶码减一是电路级的一个过程,无法分开 我的网速,魔幻了一天了,居然是负的
相关文章推荐
- C语言中 char 类型的取值范围为什么是-128~127
- 八位二进制数为什么表示范围是:-128~~+127?
- 为什么Java byte 类型的取值范围是-128~127
- 为什么八位二进制表示范围为-128~127?
- 为什么Java byte 类型的取值范围是-128~127
- 为什么8位二进制的补码取值范围是-128~127
- java中为什么byte的取值范围是-128到+127
- 解读为什么有符号的char可表示范围是-128~+127
- 带符号的char类型取值范围为什么是-128——127
- 浅析为什么char类型的范围是 —128~+127
- java中byte取值范围为什么是 -128到127
- 带符号的char类型取值范围为什么是-128——127
- 为什么java中Byte类型的取值范围是-128~127
- byte范围为什么是(-128~127)?
- 为什么signed取值为-128到127?
- java byte类型为什么是(127—— -128)
- 判断Integer值相等最好不用==最好使用equals(Integer 的值在[-128,127]之间都是可以用==比较的。超过这个区间就得用equals比较)
- char为什么取值-128——127
- 为什么JavaByte类型的取值范围是-128~127
- 为什么选择scala而不用java开发spark