浮点运算要把阶码和尾数分别处理。
阶码的运算是定点整数运算,对阶码的运算四种:阶码加1,阶码减1,两阶码求和,两阶码求差。
尾数的运算是定点小数运算,运算过程中一般取双符号位
浮点运算器总是由处理阶码和处理尾数的两部分组成
浮点数的溢出(Overflow)
当一个数的大小超出了浮点数的表示范围时,机器无法表示该数,就发生溢出。浮点数的溢出判断方法与定点数不同,是对规格化数的阶码进行判断。
当浮点数的阶码大于机器所能表示的最大阶码时(即阶码发生正溢出),此时机器应停止运算,进行出错中断处理。
浮点数的尾数运算的溢出可以通过右规消除,所以不算溢出
当浮点数的阶码小于机器所能表示的最小阶码时(即阶码发生负溢出),这时一般规定把该浮点数的尾数强迫置零,作为零处理,机器可继续运行。
当一个浮点数的尾数为0,不论其阶码为何值,或者阶码的值小于等于都把该浮点数看成零值,称为机器零。
浮点加法运算
1.对阶(Alignment)
2.尾数相加(Mantissa)
完成对阶后,将两浮点数的尾数部分相加,方法与定点小数加法相同
3.规格化处理(Normalize the Result)
对右移的两种情况做一下特殊说明:
10,110 -> 11,011
01,110 -> 00,111
4.舍入操作(Rounding)
5.检查阶码是否溢出(Check the Exponent Overflow or Underflow)
若阶码正常,加减运算正常结束;若阶码下溢,要置运算结果为浮点形式的机器零;若阶码上溢,则置溢出标志
例题
总结
在做题过程中,有一些小细节难免会忽略,这里做一个总结:
- 对阶时,尾数如果右移,不是直接添加0,而是看尾符是什么,就添加什么
- 对阶时,尾数如果左移,最低位直接加0,高位也不会把尾符挤掉,而是直接丢掉
- 规格化时,尾数为01.1...或10.0...就要进行右移一次(将符号位移从左往右数第二个数移下来,符号位最高位表示这个数的真实符号)。
- 规格化时,尾数为00.0...或11.1...就要进行左移,高位不会挤掉符号位,而是直接丢弃
- 浮点数溢出只有一种情况,就是阶码溢出