1. 浮点加减法运算
1.1 运算原理
设有两个浮点数 X = M X × 2 E X X=M_X\times2^{E_X} X=MX×2EX 和 Y = M Y × 2 E Y Y=M_Y\times2^{E_Y} Y=MY×2EY,且 E X > E Y E_X>E_Y EX>EY。若要求 X ± Y X\pm Y X±Y 的结果为 S S S,则 S = X ± Y = M S × 2 E S S=X\pm Y=M_S\times2^{E_S} S=X±Y=MS×2ES其中 E S = E X , M S = M X ± ( M Y SHR ( E X − E Y ) ) E_S=E_X,M_S=M_X\pm(M_Y\ \text{SHR}\ (E_X-E_Y)) ES=EX,MS=MX±(MY SHR (EX−EY))
1.2 运算步骤
- 零操作数检查
若至少存在一个操作数为 0 0 0 ,则不必运算,节省运算时间 - 两操作数对阶(使小数点位置对齐,为加减运算做准备)
- 原则:以较大的阶码为标准,调整阶码较小的数据(避免阶码较大的浮点数的尾数左移,导致最高有效数位丢失)
- 具体操作
- 求阶差 Δ E = E X − E Y \varDelta E=E_X-E_Y ΔE=EX−EY
- 调整阶码较小的数据
- 若 Δ E > 0 \varDelta E >0 ΔE>0,则 M Y M_Y MY 右移 Δ E \varDelta E ΔE,结果的阶码为 E X E_X EX
- 若 Δ E < 0 \varDelta E <0 ΔE<0,则 M X M_X MX 右移 ∣ Δ E ∣ |\varDelta E| ∣ΔE∣,结果的阶码为 E Y E_Y EY
- 尾数相加减(以双符号位的补码形式进行加减法操作)
- 结果的规格化
两尾数加减的结果有两种情况:- 尾数溢出:尾数右移 1 1 1 位,阶码加 1 1 1
- 尾数为非规格化数据:尾数左移,阶码减小,直至数值位最高位与符号位相反
- 结果的舍入处理
在对阶或右规操作时,会使加数或结果的尾数低若干位移出,影响精度,常用两种舍入处理方法:- 方法
1
1
1:
0
0
0 舍
1
1
1 入法
- 保留右移时的移出位,若最高位为 1 1 1 ,则尾数加 1 1 1;否则 舍去
- 特点:精度较高,但需要记录所有的移出位
- 方法2:恒置
1
1
1 法
- 若之前步骤有右移操作,则直接将结果的最低位置 1 1 1
- 特点:精度较 0 0 0 舍 1 1 1 入法较低,但应用简单
- 方法
1
1
1:
0
0
0 舍
1
1
1 入法
- 结果的溢出判断
- 尾数溢出
在规格化处理时,通过右规完成 - 阶码溢出
- 上溢:结果绝对值太大,置上溢标志,结束
- 下溢:结果绝对值太小,置机器零
- 正常:运算结束
- 尾数溢出
2. 浮点乘除法运算
2.1 运算原理
设有两个浮点数 X = 2 E X ⋅ M X X=2^{E_X}\cdot M_X X=2EX⋅MX 和 Y = 2 E Y ⋅ M Y Y=2^{E_Y}\cdot M_Y Y=2EY⋅MY,则 X × Y = 2 E X + E Y ⋅ ( M X × M Y ) X ÷ Y = 2 E X − E Y ⋅ ( M X ÷ M Y ) X\times Y=2^{E_X+E_Y}\cdot (M_X\times M_Y) \\X\div Y=2^{E_X-E_Y}\cdot (M_X\div M_Y) X×Y=2EX+EY⋅(MX×MY)X÷Y=2EX−EY⋅(MX÷MY)
2.2 运算步骤
- 0 0 0 操作数检查
- 阶码加减操作
运算规则: [ x + y ] 移 = ( [ x ] 移 + [ y ] 补 ) mod 2 n + 1 = ( [ y ] 移 + [ x ] 补 ) mod 2 n + 1 [ x − y ] 移 = [ x ] 移 + [ − y ] 补 = ( [ − y ] 移 + [ x ] 补 ) mod 2 n + 1 [x+y]_移=([x]_移+[y]_补)\text{ mod }2^{n+1}=([y]_移+[x]_补)\text{ mod }2^{n+1}\\ [x-y]_移=[x]_移+[-y]_补=([-y]_移+[x]_补)\text{ mod }2^{n+1} [x+y]移=([x]移+[y]补) mod 2n+1=([y]移+[x]补) mod 2n+1[x−y]移=[x]移+[−y]补=([−y]移+[x]补) mod 2n+1
移码采用双符号位,对溢出进行检测:
符号位 | 结果 |
---|---|
01 01 01 | 为正 |
00 00 00 | 为负 |
10 10 10 | 上溢( ∞ ∞ ∞) |
11 11 11 | 下溢( 0 0 0) |
- 尾数乘除操作
- 尾数上溢:重新对阶
- 尾数下溢:舍入
- 结果规格化和舍入处理
2.3 尾数的处理
- 截断
- 舍入(尾数用原码表示时)
- 只要尾数最低为 1 1 1 或者移出位中有 1 1 1 数值位,使最低位置 1 1 1
- 0 0 0 舍 1 1 1 入
- 舍入(尾数用补码表示时)
- 丢失的位全为 0 0 0,不必舍入
- 丢失的最高位为 0 0 0,以后各位不全为 0 0 0 时;或者最高为 1 1 1,以后各位全为 0 0 0 时, 则舍去丢失位上的值
- 丢失的最高位为 1 1 1,以后各位不全为 0 0 0 时,则在尾数的最低位入 1 1 1 的修正操作