浮点数的运算

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=EXMS=MX±(MY SHR (EXEY))

1.2 运算步骤
  • 零操作数检查
    若至少存在一个操作数为 0 0 0 ,则不必运算,节省运算时间
  • 两操作数对阶(使小数点位置对齐,为加减运算做准备)
    • 原则:以较大的阶码为标准,调整阶码较小的数据(避免阶码较大的浮点数的尾数左移,导致最高有效数位丢失)
    • 具体操作
      • 求阶差 Δ E = E X − E Y \varDelta E=E_X-E_Y ΔE=EXEY
      • 调整阶码较小的数据
        • Δ 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 入法较低,但应用简单
  • 结果的溢出判断
    • 尾数溢出
      在规格化处理时,通过右规完成
    • 阶码溢出
      • 上溢:结果绝对值太大,置上溢标志,结束
      • 下溢:结果绝对值太小,置机器零
      • 正常:运算结束

2. 浮点乘除法运算

2.1 运算原理

设有两个浮点数 X = 2 E X ⋅ M X X=2^{E_X}\cdot M_X X=2EXMX Y = 2 E Y ⋅ M Y Y=2^{E_Y}\cdot M_Y Y=2EYMY,则 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=2EXEY(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[xy]=[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 的修正操作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值