1. 问题
什么是浮点数的溢出?什么情况下发生上溢出?什么情况下发生下溢出?
2. 解析
浮点数的运算结果可能出现一下四种情况:
- 阶码上溢出
- 阶码下溢出
- 尾数溢出
- 非规格化尾数
-
首先,阶码上溢出。正指数(即阶码值)超过了最大允许值。比如阶码用8bit移码表示,正指数却有128,即无法表示(8bit移码中真值表示范围为-126~127,-127的阶码全0表示非规格化数;而-128的阶码全1,表示无穷大)即上溢出。 如果结果为整数,则称为正上溢出;如果结果为负数,则称为负上溢出。这种情况为软件故障,需要引入溢出故障处理程序来处理。
-
阶码下溢出,一个负指数比最小所允许的数值还要小时,发生下溢出,例如上面例子中用阶码表示-130,小于真值表示范围的最小值,发生下溢出。一般机器把下溢出时的值置为0.
-
尾数溢出,当尾数中最高有效位发生进位时,发生尾数溢出。(即尾数的bit位表示不下尾数值)此时,需要进行 “右规格化”操作:尾数右移一位,阶码加1,直到尾数不再溢出。不过右移过程中可能会舍入,引起误差。
-
非规格化尾数,当数值部分高位不是有效值时,例如:
- 尾数用原码表示则尾数最高数值位必须为1
- 尾数用补码表示则符号位必须与最高数值位相反
此时需要进行“左规格化”操作:尾数左移一位,阶码减1,直到尾数为规格化为止。
3. 总结
浮点数溢出最终都可以归一成阶码溢出,比如情况3和情况4,通过规格化操作进行算数移位来增减阶码,如果阶码变动之后,大于阶码表示范围的最大值,则是上溢出;小于阶码表示范围的最小值,则是下溢出。