【學習計算機組成原理】浮點數的加減運算

現實中的科學計算法的加法運算

0.123×105+0.560×102=?0.123\times10^{5}+0.560\times10^{2}=?
我們是怎麼算呢?

  1. 通過移動小數點將它們的指數對齊
    0.560×102=0.00056×1050.560\times10^{2}=0.00056\times10^{5}
  2. 兩個尾數相加
    0.123+0.00056=0.123560.123+0.00056=0.12356
  3. 將結果四捨五入
    0.12356×105=0.124×1050.12356\times10^{5}=0.124\times10^{5}

機器內部

XmYmXYXeYeXYXe<Ye設X_m,Y_m是X,Y的尾數,X_e,Y_e是X,Y的階碼。(X_e<Y_e)

  • 和將指數對齊意思一樣,有個名詞叫對階,因爲浮點數的指數用階碼錶示,對階就是讓階碼相同。
  • 現實生活中,指數大的像小的看齊也行,小的像大的看齊也行。在機器中是小階像大階看齊。階小的數尾數右移,右移位數是兩個數的階碼差的絕對值。
  • IEEE 754尾數右移時,要將不顯示錶示的1移到小數位,高位補0,低位移到附加位

計算兩數階碼差

Δe=YeXe\Delta e=Y_e-X_e

[ΔE]=[ExEy]=[Ex][Ey]=[Ex]+[[Ey]]mod2n[\Delta E]_{補}=[E_x-E_y]_{補}=[E_x]_{移}-[E_y]_{移}=[E_x]_{移}+[-[E_y]_{移}]_{補}(mod 2^n) 公式參考

  • ΔE\Delta E大於階碼所能表示的最大值時,即溢出時,則無法判斷階差。
  • 在IEEE 754中,對於單精度,由於可以表示24位尾數,所以當ΔE\Delta E大於24時,則階數小的數視爲0,結果等於階數大的數。

對階

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

尾數加減

Xm×2XeYe±YmX_m\times2^{X_e-Y_e}±Y_m

將結果規格化

  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×21(0.5)_{10}=(0.1)_2=1.000\times2^{-1}
(0.4375)10=(0.0111)2=1.110×22(-0.4375)_{10}=(-0.0111)_2=-1.110\times2^{-2}
1.110×22=0.111×21對階:-1.110\times2^{-2}=-0.111\times2^{-1}
1.000×210.111×21=0.001×21相減:1.000\times2^{-1}-0.111\times2^{-1}=0.001\times2^{-1}
0.001×21=1.000×24規格化:0.001\times2^{-1}=1.000\times2^{-4}
無溢出
(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

  • 對-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

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