在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
请实际算一下。
另一个问题的话,我问过别人,答案是尾数左移和阶码减一是电路级的一个过程,无法分开
我的网速,魔幻了一天了,居然是负的