現實中的科學計算法的加法運算
0.123×105+0.560×102=?
我們是怎麼算呢?
- 通過移動小數點將它們的指數對齊
0.560×102=0.00056×105
- 兩個尾數相加
0.123+0.00056=0.12356
- 將結果四捨五入
0.12356×105=0.124×105
機器內部
設Xm,Ym是X,Y的尾數,Xe,Ye是X,Y的階碼。(Xe<Ye)
- 和將指數對齊意思一樣,有個名詞叫對階,因爲浮點數的指數用階碼錶示,對階就是讓階碼相同。
- 現實生活中,指數大的像小的看齊也行,小的像大的看齊也行。在機器中是小階像大階看齊。階小的數尾數右移,右移位數是兩個數的階碼差的絕對值。
- IEEE 754尾數右移時,要將不顯示錶示的1移到小數位,高位補0,低位移到附加位。
計算兩數階碼差
Δe=Ye−Xe
[ΔE]補=[Ex−Ey]補=[Ex]移−[Ey]移=[Ex]移+[−[Ey]移]補(mod2n) 公式參考
- 當ΔE大於階碼所能表示的最大值時,即溢出時,則無法判斷階差。
- 在IEEE 754中,對於單精度,由於可以表示24位尾數,所以當ΔE大於24時,則階數小的數視爲0,結果等於階數大的數。
對階
將Xm右移Δe位。Xm→Xm×2−Δe,保留右移出的部分到附加位。
尾數加減
Xm×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.4375)10=(−0.0111)2=−1.110×2−2
對階:−1.110×2−2=−0.111×2−1
相減:1.000×2−1−0.111×2−1=0.001×2−1
規格化:0.001×2−1=1.000×2−4
無溢出
結果是(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
-
對-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