IEEE浮点数
IEEE浮点数的组成
以1 10000011 1001001000000000000000
第一位为符号位,1表示负数,0表示正数
第2~9位共8位为阶码,
阶码是由阶码真值加上01111111(127)形成的
第10~32共23位为尾数
尾数前面省略了一个1,因此真实的尾数前面应该多一个1,这是IEEE浮点数规矩
因此该数表示的真实的数是 -201000000*1.1001001000000000000000
IEEE浮点数的加减法,以阶码为3为,尾数为6为举例
X = 2-011 * 0.100101 Y = 2-010 *(-0.011110)
X = 11101 00.100101
第一步对阶,小阶对大阶
可以看到Y的尾数小数点前后都是0,不符合规格化浮点数的定义
因此对Y进行规格化,对Y进行左移,阶码减一
Y = 2-011 *(-0.111100)
Y = 11101 11.000100
可以看到X和Y是同阶的,因此不需要对阶
第二步加减
加:X+Y = 00.100101 + 11.000100 = 11.101001
减:X -Y = 00.100101 + 00.111100 = 01.100001
00.111100是Y的尾数的负数的补码
第三步.规格化处理
正数的反码补码和原码相同
只有负数才需要对补码和反码进行处理
规格化的六种情况
尾数用双符号位表示运算后的结果有下面6种情况
①:00.1XX…X
②:11.0XX…X
③00.0XX…X
④11.1XX…X
⑤01.XXX…X
⑥10.XXX…X
①②两种情况符合规格化浮点数的定义
③④两种情况不是规格化数,需要使尾数左移实现规格化,尾数每左移一次,阶码需要减1
⑤⑥这两种情况在定点加减运算种成为溢出,但在浮点加减运算中只表明此时尾数的绝对值大于1,而非真正的溢出,这种情况应将尾数右移实现规格化,尾数每右移一位,阶码响应加1
加:X+Y = 00.100101 + 11.000100 = 11.101001
可以看到小数点前后相同,因此需要左移一次,成为11.010010,然后阶码减一
结果为== 11100 11.010010==
减:X -Y = 00.100101 + 00.111100 = 01.100001
可以看到符号位两位不同,结果应该是溢出了,因此需要右移一次,阶码加一
结果为11110 00.110000(1)
第四步,舍入处理
X+Y:11100 11.010010无需进行舍入处理,转换为原码后结果为2-100*(-0.101110)
X-Y:11110 00.110000(1) 按照0舍1入的原则.结果为== 2-010*(0.110000)==
第五步,溢出判断
如果右规后,仍然不符合规格化浮点数的定义,说明此时运算结果溢出
当[Ec]补 =01,XXX…X,表示上溢.此时,浮点数真正溢出,机器需停止运算,做溢出中断处理
当[Ec]补=10,XXX…X,表示下溢.浮点数值趋于0,机器不做溢出处理,而是按机器0处理