文章目录
现实中的科学计算法的加法运算机器内部计算两数阶码差对阶尾数加减将结果规格化判断溢出舍入附加位例子现实中的科学计算法的加法运算
0.123×105+0.560×102=?0.123\times10^{5}+0.560\times10^{2}=?0.123×105+0.560×102=?
我们是怎么算呢?
通过移动小数点将它们的指数对齐
0.560×102=0.00056×1050.560\times10^{2}=0.00056\times10^{5}0.560×102=0.00056×105两个尾数相加
0.123+0.00056=0.123560.123+0.00056=0.123560.123+0.00056=0.12356将结果四舍五入
0.12356×105=0.124×1050.12356\times10^{5}=0.124\times10^{5}0.12356×105=0.124×105
机器内部
设Xm,Ym是X,Y的尾数,Xe,Ye是X,Y的阶码。(Xe<Ye)设X_m,Y_m是X,Y的尾数,X_e,Y_e是X,Y的阶码。(X_e<Y_e)设Xm,Ym是X,Y的尾数,Xe,Ye是X,Y的阶码。(Xe<Ye)
和将指数对齐意思一样,有个名词叫对阶,因为浮点数的指数用阶码表示,对阶就是让阶码相同。现实生活中,指数大的像小的看齐也行,小的像大的看齐也行。在机器中是小阶像大阶看齐。阶小的数尾数右移,右移位数是两个数的阶码差的绝对值。IEEE 754尾数右移时,要将不显示表示的1移到小数位,高位补0,低位移到附加位。
计算两数阶码差
Δe=Ye−Xe\Delta e=Y_e-X_eΔe=Ye−Xe
[ΔE]补=[Ex−Ey]补=[Ex]移−[Ey]移=[Ex]移+[−[Ey]移]补(mod2n)[\Delta E]_{补}=[E_x-E_y]_{补}=[E_x]_{移}-[E_y]_{移}=[E_x]_{移}+[-[E_y]_{移}]_{补}(mod 2^n)[ΔE]补=[Ex−Ey]补=[Ex]移−[Ey]移=[Ex]移+[−[Ey]移]补(mod2n) 公式参考
当ΔE\Delta EΔE大于阶码所能表示的最大值时,即溢出时,则无法判断阶差。在IEEE 754中,对于单精度,由于可以表示24位尾数,所以当ΔE\Delta EΔE大于24时,则阶数小的数视为0,结果等于阶数大的数。
对阶
将Xm右移Δe位。Xm→Xm×2−Δe,保留右移出的部分到附加位。将X_m右移\Delta e位。X_m→X_m\times2^{-\Delta e},保留右移出的部分到附加位。将Xm右移Δe位。Xm→Xm×2−Δe,保留右移出的部分到附加位。
尾数加减
Xm×2Xe−Ye±YmX_m\times2^{X_e-Y_e}±Y_mXm×2Xe−Ye±Ym
将结果规格化
当尾数高位为0需左归:每左移一次,阶码减一,直到MSB(最高有效位)为1。当尾数最高位有进位,需右归:每右移一次,阶码加一,直到MSB为1。每次阶码变化,都需要判断阶码是否上溢或下溢。阶码上溢时异常处理,下溢时结果为0。判断溢出
若运算结果的尾数(包含小数点前的一位)全为0,则下溢。
若最终阶码全为1,则上溢。
舍入
就近舍入(默认)附加位: 值为01时舍值为11时入值位10时强制结果为偶数 往正无穷方向舍入往负无穷方向舍入往0方向舍入
还可以增加一个粘位,精度更高
尾数代表的实际值是0,则将阶码置0。(因为浮点数表示0的格式原因)
附加位
IEEE 754规定:中间结果需在右边加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×2−1
(−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×2−2
对阶:−1.110×2−2=−0.111×2−1对阶:-1.110\times2^{-2}=-0.111\times2^{-1}对阶:−1.110×2−2=−0.111×2−1
相减: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×2−1−0.111×2−1=0.001×2−1
规格化:0.001×2−1=1.000×2−4规格化:0.001\times2^{-1}=1.000\times2^{-4}规格化:0.001×2−1=1.000×2−4
无溢出无溢出无溢出
结果是(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