【学习计算机组成原理】浮点数的加减运算

现实中的科学计算法的加法运算

0.123 × 1 0 5 + 0.560 × 1 0 2 = ? 0.123\times10^{5}+0.560\times10^{2}=? 0.123×105+0.560×102=?
我们是怎么算呢?

  1. 通过移动小数点将它们的指数对齐
    0.560 × 1 0 2 = 0.00056 × 1 0 5 0.560\times10^{2}=0.00056\times10^{5} 0.560×102=0.00056×105
  2. 两个尾数相加
    0.123 + 0.00056 = 0.12356 0.123+0.00056=0.12356 0.123+0.00056=0.12356
  3. 将结果四舍五入
    0.12356 × 1 0 5 = 0.124 × 1 0 5 0.12356\times10^{5}=0.124\times10^{5} 0.12356×105=0.124×105

机器内部

设 X m , Y m 是 X , Y 的 尾 数 , X e , Y e 是 X , Y 的 阶 码 。 ( X e < Y e ) 设X_m,Y_m是X,Y的尾数,X_e,Y_e是X,Y的阶码。(X_e<Y_e) XmYmXYXeYeXYXe<Ye

  • 和将指数对齐意思一样,有个名词叫对阶,因为浮点数的指数用阶码表示,对阶就是让阶码相同。
  • 现实生活中,指数大的像小的看齐也行,小的像大的看齐也行。在机器中是小阶像大阶看齐。阶小的数尾数右移,右移位数是两个数的阶码差的绝对值。
  • IEEE 754尾数右移时,要将不显示表示的1移到小数位,高位补0,低位移到附加位

计算两数阶码差

Δ e = Y e − X e \Delta e=Y_e-X_e Δe=YeXe

[ Δ E ] 补 = [ E x − E y ] 补 = [ E x ] 移 − [ E y ] 移 = [ E x ] 移 + [ − [ E y ] 移 ] 补 ( m o d 2 n ) [\Delta E]_{补}=[E_x-E_y]_{补}=[E_x]_{移}-[E_y]_{移}=[E_x]_{移}+[-[E_y]_{移}]_{补}(mod 2^n) [ΔE]=[ExEy]=[Ex][Ey]=[Ex]+[[Ey]]mod2n 公式参考

  • Δ E \Delta E ΔE大于阶码所能表示的最大值时,即溢出时,则无法判断阶差。
  • 在IEEE 754中,对于单精度,由于可以表示24位尾数,所以当 Δ E \Delta E ΔE大于24时,则阶数小的数视为0,结果等于阶数大的数。

对阶

将 X m 右 移 Δ e 位 。 X m → X m × 2 − Δ e , 保 留 右 移 出 的 部 分 到 附 加 位 。 将X_m右移\Delta e位。X_m→X_m\times2^{-\Delta e},保留右移出的部分到附加位。 XmΔeXmXm×2Δe

尾数加减

X m × 2 X e − Y e ± Y m X_m\times2^{X_e-Y_e}±Y_m Xm×2XeYe±Ym

将结果规格化

  1. 当尾数高位为0需左归:每左移一次,阶码减一,直到MSB(最高有效位)为1。
  2. 当尾数最高位有进位,需右归:每右移一次,阶码加一,直到MSB为1。
  3. 每次阶码变化,都需要判断阶码是否上溢或下溢。阶码上溢时异常处理,下溢时结果为0。

判断溢出

若运算结果的尾数(包含小数点前的一位)全为0,则下溢。
若最终阶码全为1,则上溢。

舍入

  1. 就近舍入(默认)
    附加位:
    1. 值为01时舍
    2. 值为11时入
    3. 值位10时强制结果为偶数
  2. 往正无穷方向舍入
  3. 往负无穷方向舍入
  4. 往0方向舍入

还可以增加一个粘位,精度更高

尾数代表的实际值是0,则将阶码置0。(因为浮点数表示0的格式原因)

附加位

IEEE 754规定:中间结果需在右边加2个附加位。

  1. 保护位:在有效数字位右边的位
  2. 舍入位:在保护位右边的位

作用:保存对阶时右移的位或运算的中间结果
处理:左归时被移到有效数字位。作为舍入的依据。

例子

求0.5-0.4375的值
脑补过程:
( 0.5 ) 10 = ( 0.1 ) 2 = 1.000 × 2 − 1 (0.5)_{10}=(0.1)_2=1.000\times2^{-1} (0.5)10=(0.1)2=1.000×21
( − 0.4375 ) 10 = ( − 0.0111 ) 2 = − 1.110 × 2 − 2 (-0.4375)_{10}=(-0.0111)_2=-1.110\times2^{-2} (0.4375)10=(0.0111)2=1.110×22
对 阶 : − 1.110 × 2 − 2 = − 0.111 × 2 − 1 对阶:-1.110\times2^{-2}=-0.111\times2^{-1} 1.110×22=0.111×21
相 减 : 1.000 × 2 − 1 − 0.111 × 2 − 1 = 0.001 × 2 − 1 相减:1.000\times2^{-1}-0.111\times2^{-1}=0.001\times2^{-1} 1.000×210.111×21=0.001×21
规 格 化 : 0.001 × 2 − 1 = 1.000 × 2 − 4 规格化:0.001\times2^{-1}=1.000\times2^{-4} 0.001×21=1.000×24
无 溢 出 无溢出
结 果 是 ( 0.0001 ) 2 = ( 0.0625 ) 10 结果是(0.0001)_2=(0.0625)_{10} (0.0001)2=(0.0625)10

在寄存器中:
-1用移码表示为1111 1111+0111 1111=0111 1110
-2的移码等于-1的移码减1,所以值为0111 1101
-2的变补码为1000 0011(两阶码减法用)
+0.5可表示为0 01111110 00000000000000000000000
-0.4375可表示为1 01111101 11000000000000000000000
Δ e = 01111110 + 10000011 = 00000001 > 0 \Delta e=0111 1110+1000 0011=00000001>0 Δe=01111110+10000011=00000001>0

  • 对-0.4375进行对阶(3个附加位)
    右移1位得:1 01111110 11100000000000000000000 000(红色是移动的位,左边补隐藏位1)

  • 尾数相加:001.00000000000000000000000 000+100.11100000000000000000000 000=000.00100000000000000000000 000
    (过程参考原码加法

    • 最高位是符号位,最后三位是附加位
    • 小数点前有两位,为了避免两个1相加时产生的进位丢失。
    • 有1则需要显示的表示出来,并放在小数点前一位。
    • 实际过程没有小数点,这里为了表达清楚。
  • 左归:
    左移三次:000.00100000000000000000000 000→001.00000000000000000000000
    阶码减三次1:01111110→01111011

  • 结果:0 01111011 00000000000000000000000

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鸡

如果帮到您,点个赞鼓励一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值