二進制浮點數的加減法運算

二進制浮點數的規格化表示形式定義爲N=2EMN=2^E·M其中MM稱爲尾數,EE稱爲階碼

例如二進制浮點數11.011011的規格化表示形式爲:2+0010×0.110110112^{+0010}×0.11011011該浮點數在計算機中存儲爲:

00100011011011

各個二進制位代表的含義爲:
階符E | 階碼E | 尾符M | 尾碼M
00      010    00      11011011

現假設有兩浮點數XXYY
X:2+010×0.11011011X:2^{+010}×0.11011011Y2+100×0.10101100Y:2^{+100}×-0.10101100
XXYY在計算機中表示爲:

    階符E | 階碼E | 尾符M | 尾碼M
X   00      010    00      11011011
Y   00      100    11      01010100

要在計算機中實現加減法運算要執行5個步驟:

1. 對階

對階的目的是爲了使兩個階數不同的浮點數變換到爲可以直接相加,例如在十進制中1.2×1021.2×10^22.3×1032.3×10^3的尾數是不能直接相加的,必須轉換成相同的階數纔可以相加
1.2×102+ 2.3×1033.3×10?0.12×103+ 2.3  ×1032.42×103\begin{aligned} & \quad 1.2 × 10^2 \\ & \underline{+\ 2.3 × 10^3}\\ & \quad 3.3 × 10^?\\ \end{aligned}\Longrightarrow \begin{aligned} & \quad 0.12 × 10^3 \\ & \underline{+\ 2.3 \ \ × 10^3}\\ & \quad 2.42 × 10^3\\ \end{aligned}

1.1 取大階

保留兩個浮點數中階碼較大的那一個浮點數的階數,較小階碼的浮點數的階數在之後需要對齊大階,取大階的公式爲:Emax=max(EX,EY)E_{max} = \max(E_X,E_Y)之所以是取大階而不是取小階是因爲,浮點數往小階對其後,小數點會進入尾數之中,與上面舉的例子不同,這種浮點數形式是無法在計算機中存儲的。

取大階舉例,對XXYY取大階:
Emax=max(EX,EY)=EYE_{max} = \max(E_X,E_Y)=E_Y

1.2 求階差

求出階差後可以根據階差對階碼小的浮點數的尾數進行調整,求階差公式:ΔE=EXEY\Delta E = |E_{X}-E_{Y}|_{補}

求階差舉例,對XXYY求階差:
ΔE=EXEY=EXEY=EX+(EY)=00010+11100=11110=2\begin{aligned} \Delta E=& |E_{X}-E_{Y}|_{補}\\ =& |E_{X補}-E_{Y補}|\\ =& |E_{X補}+(-E_{Y})_{補}|\\ =& |00010 + 11100|\\ =& |11110|=2 \end{aligned}

1.3 對階

1.2求階差ΔE0\Delta E \neq 0,則執行對階操作,將階碼值較小的浮點數尾數右移ΔE\Delta E位,使得兩個浮點數的階碼值相等。

由於進行了右移,對階操作往往會損失階碼值較小的浮點數的一部分精度從而產生計算誤差,若要減小計算誤差,則要將右移過程中損失的尾數值保留下了以供後面3.2.2左規格化和4.2舍入步驟使用,這裏不細說。

對階舉例,對XXYY對階:
已知XXYY的大階階碼Emax=EYE_{max}=E_Y,階差ΔE=2\Delta E=2。即EXE_X位向EYE_Y對齊,且MXM_X右移ΔE\Delta E位:
000100011011011001000000110110\underline{00010}00\underline{11011011}\Longrightarrow\underline{00100}00\underline{00110110}對階後的XXYY:

    階符E | 階碼E | 尾符M | 尾碼M
X   00      100    00      00110110
Y   00      100    11      01010100

對階前的XXYY:

    階符E | 階碼E | 尾符M | 尾碼M
X   00      010    00      11011011
Y   00      100    11      01010100

2. 尾數運算

2.1 尾數運算

對階操作完成之後浮點數的尾數就可以進行運算了,公式可以表示爲:M=[(MX)±(MY)]M=[(M_X)\pm(M_Y)]_補

尾數運算舉例,對XXYY的尾數進行運算:
M=[(MX)+(MY)]=(MX)+(MY)M=[(M_X)+(M_Y)]_補=(M_X)_補+(M_Y)_補
001000000110110+ 001001101010100001001110001010\begin{aligned} & \quad 00100\underline{0000110110} \\ & \underline{+\ 00100\underline{1101010100}}\\ & \quad 00100\underline{1110001010}\\ \end{aligned}

3. 規格化

3.1 判斷尾數溢出

雙符號位的判斷溢出方法:二進制數的符號一定爲00(正)或11(負),運算後若符號位變爲01則是正溢出,變爲10則是負溢出,二進制數相加結果符號位溢出判斷如下表所示:

正數 負數 正溢 負溢
00 11 01 10

可以簡記爲,符號位異或的結果爲0則溢出,爲1則不溢出。

3.2 左右規格化
3.2.1 右規格化

若尾數加減後的結果MM溢出則執行右規格化操作,即尾數右移一位且階碼加1,表示爲M1,E+1M\gg 1,E+1

3.2.2 左規格化

若尾數加減後的結果MM不溢出則執行左規格化操作,即尾數左移K位且階碼減K,表示爲MK,EKM\ll K,E-K其中KK表示將尾數數值最高位變爲與尾數符號位不同值需要執行左移的次數。注意此處的左移要包括1.3對階時被移出低位的尾數值。

左規格化的目的是爲了提高尾數的精度,例如,M=001001110001010M=001001110001010轉爲真值表示爲24×0.011101102^4×-0.01110110,由於在計算機中尾數的存儲位數有限,這種表示方法就會造成精度的下降,改爲23×0.111011002^3×-0.11101100就可以多存一個位的數據

尾數運算舉例,對MM的尾數進行左規格化:
尾數左移1位(括號中爲對階時被移出低位的尾數值):1110001010(11)1100010101(1)1\underline{11}0001010(11)\Longrightarrow 1\underline{10}0010101(1)階碼減1:0010000001=0001100100-00001=00011

4. 舍入

4.1 判斷階碼溢出

如果在上一步執行的是右規格化,則要判斷階碼是否上溢,若執行的是左規格化,則要判斷階碼是否下溢。

判斷方法與3.1一致,符號位異或的結果爲0則溢出,爲1則不溢出。右規格化若上溢則置上溢標誌並且報運算結果溢出錯誤,左規格化若下溢則置機器零到5.4輸出結果

4.2 舍入

若左右規格化的步驟執行後結果不溢出,則進行舍入處理。

在執行3.2.1右規格化和1.3對階時,尾數低位上的數值會被移除掉使得浮點數精度下降。舍入就是用來彌補被移除掉的精度,當移除掉的低位數值最高位爲1時,在規格化後的尾數末尾加1,若加1後使得尾數溢出,則需再執行一次右規格化。

舍入舉例,對規格化後的MM的尾數進行舍入:
在1.3對階時被移除掉的兩個低位數是11,則移除掉的低位數值最高位爲1,應在規格化後的尾數末尾加1,得到:M=M+1=1100010101+000000001=1100010110M=M+1=1100010101+000000001=1100010110

5. 判溢出

5.1 判斷尾數溢出

執行完舍入之後,要判斷舍入之後的尾數是否溢出,判斷方法與3.1一致,符號位異或的結果爲0則溢出,爲1則不溢出。若不溢出則輸出結果。

若溢出則需要在執行一次右規格化,然後判斷是否上溢,若上溢則置上溢標誌並且報運算結果溢出錯誤,若不上溢則輸出運算結果

5.4 輸出結果

最終結果可以用X±YX\pm Y來表示,其值就是EM的真值X±Y=E×MX\pm Y=E_真×M_真

結果舉例,對規格化後的MM的尾數進行舍入:
M=1100010110X+Y=E×M=2011×0.11101010M=1100010110\Longrightarrow X+Y=E_真×M_真=2^{011}×-0.11101010

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章