一、浮点数加减运算
在计算机中,浮点数遵循补码运算
浮点数表示:两位尾符,尾数;两位阶符,阶数
1) 对阶
1、求阶差
△j = jx - jy
2、小阶向大阶看齐
若 △j < 0,则 x 向 y 看齐
若 △j > 0,则 y 向 x 看齐
原因:当指数增大时,尾数就要向右移(对二进制来说),这时可能会丢失最后面的最低位
当指数减小时,尾数就要向左移,这时可能会丢失最前面的最高位
当 100001 * 2 ^ 8 丢失最后一个 1 的时候,变成 10000 * 2 ^ 9,丢失了较小的精度 1
而 100001 * 2 ^ 8 丢失最先一个 1 的时候,变成 1 * 2 ^ 7,数据发生了错误
(上面的数只是为了说明,一般浮点数需要规格化)
2) 尾数求和
对阶后的尾数遵循二进制的加减法,求和即可
3) 规格化
一般的浮点数规格化形式:0.1--- * 2 ^ n
所以,对于正数而言:
规格化:原码、补码的形式都是 0.1--- * 2 ^ n
对于负数而言:
真值:-0.1--- * 2 ^ n
原码:1.1--- * 2 ^ n
补码:1.0--- * 2 ^ n
特例:
[-1/2]补不是规格化的数 1.100---0
[-1]是规格化的数 1.00---0
1、左规(算数移位)
当 2 ^ -1 位表示的真值为 0 的时候,尾数左移,阶数 -1
2、右规(可看做逻辑右移)
当 两位符号位不一致 的时候,尾数右移,阶数 +1
4) 舍入
在尾数右移的所有环节,可能会发生精度的丢失,这时需要进行舍入:
1、0 舍 1 入(常用)
2、恒置 1
5) 溢出判断
浮点数所能表示的
最大正值:指数最大,尾数最大
最小正值:指数最小,尾数为最小的正值
最大负值:-最小的正值
最大正值:-最大的正值
对于规格化的数和非规格化的数所能表示的最大最小值是不一样的
对于这里的运算而言,尾数在移位的过程中进行了舍入,所以对于某个溢出来说,规格化的尾数是不会影响的,
只需要看阶数是否发生溢出即可。对于 n 位数值部分的阶码来说,最大值 2 ^ n - 1, 最小值 - 2 ^ n.
二、浮点数乘除运算
对于乘除法,只要尾数做补码乘除法,阶数做加减法就行了