05.Float Arithmetic
溢出
- 阶值上溢
- 正阶值超过可能的最大允许阶值 11111110 (127)
- 标记为 ±∞
- 阶值下溢
- 负阶值小于可能的最小允许阶值 00000001 (-126)
- 报告为0
- 有效值上溢 (右规)
- 同符号的两个有效值相加可能导致最高有效位的进位
- 通过重新对齐来修补
- 有效值下溢 (右规)
- 在有效值对齐过程中, 可能有数字被移出右端最低位而丢失
- 需要某种形式的四舍五入
IEEE754标准规定的五种异常
-
无效运算 (结果为NaN)
- 运算时有一个数是非有限数, 如 : ±∞, ±∞/±∞, 0*±∞等
- 结果无效, 如 : 0/0, 源操作数为NaN, 一个数对0取余等
-
有限数除以0 (结果为±∞)
-
数太大 (阶上溢, 结果为±∞)
- 如 : 对于单精度, 阶码 > 1111 1110 (127)
-
数太小 (阶下溢, 结果用非规格化数表示)
- 如 : 对于单精度, 阶码 < 0000 0001 (-126)
- IEEE754出现前阶下溢一般为0, 换言之, IEEE754解决了这一问题
-
结果不精确 (舍入时引起)
- 如 : 1/3不能精确表示为一个浮点数
加法和减法
-
必须确保两个操作数具有相同的指数值(阶)
-
计算步骤
-
检查0: X是否等于0? Y是否等于0?
-
对齐有效值: 阶码向大值对齐
-
加或减有效值: XS ± YS (原码加减法)
-
规格化结果
-
原码加法操作
-
尾数加法示例
我的理解是:
流程图
-
示例
我的理解是
上述两处 我的理解 总结: 尾数求补码时, 前面隐藏的那个数也要包括在取反加一的步骤中, 运算结果根据是否进位来判断是否要取结果的补码
乘法和除法
-
计算步骤
- 检查0: X是否等于0? Y是否等于0?
- 阶码相加减**(注意移码bias)**
- 尾数相乘除
- 规格化结果
- 同上
乘法操作
-
无论哪个操作数是0, 乘积即为0
-
从阶值的和中减去一个偏移量
-
有效值相乘
-
结果的规格化和舍入处理
- 规格化可能导致阶值下溢
- IEEE754标准中, 只有右规
- 高两位为01则无需处理
- 高两位为10或11则右规一位
-
示例
除法操作
-
检查0
- 如果除数为0, 则报告出错, 或将结果设为无穷大
- 如果被除数为0, 则结果是0
-
被除数的阶值减除数的阶值, 加上一个偏移量
-
有效值相除
-
结果规格化和舍入处理
- 规格化可能导致阶值下溢
- IEEE754标准中, 只有左规
- 高两位为01则左规一位
- 高两位为10或11则无需处理
-
示例
精度考虑
附加位
-
寄存器的长度几乎总是大于有效值位长与一个隐含位之和
-
寄存器包含的这些附加位, 也称为保护位
-
保护为用0填充, 用于扩充有效值的右端
-
IEEE754规定: 中间结果须在右边加2个附加位
- 保护位(Guard) : 在尾数右边的位, 左规时被移到尾数中
- 舍入位(Round) : 在保护位右边的位, 作为舍入的依据
舍入
-
对有效值操作的结果通常保存在"更长"的寄存器中
-
当结果转换回浮点格式时, 必须要去掉多余的位
-
就近舍入(默认方式) : 结果被舍入成最近的可表示的数
-
非中间值: 0舍1入
-
中间值: 强制结果为偶数
-
-
朝+∞舍入 : 结果朝正无穷大方向向上舍入, 舍入为 Z1
-
朝-∞舍入 : 结果朝负无穷大方向向下舍入, 舍入为 Z-1
-
朝0舍入 : 结果朝0舍入, 正数 Z-1, 负数 Z1