歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

浮點加減法的運算步驟

浮點數經常被寫成如下的形式:
        X = Mx * 2Ex

  其中Mx為該浮點數的尾數,一般為絕對值小於1的規格化的二進制小數,機器中多用原碼(或補碼)形式表示。Ex為該浮點數的階碼,一般為二進制整數,機器中多用移碼(或補碼)表示,給出的是一個指數的冪,而該指數的底常用2、8或16,我們這裡先以2為底作例子進行討論。

  浮點加減法的運算步驟
  假定有兩個浮點數
     X = Mx * 2Ex , Y = My * 2Ey

  1. 實現X±Y運算,要用如下五步完成:
  (1) 對階操作,即比較兩個浮點數的階碼值的大小.求△E=Ex-Ey。當其不等於零時,首先應使兩個數取相同的階碼值。其實現方法是,將原來階碼小的數的尾數右移|△E|位,其階碼值加上|△E|,即每右移一次尾數要使階碼加1,則該浮點數的值不變(但精度變差了)。尾數右移時,對原碼形式的尾數,符號位不參加移位,尾數高位補0;對補碼形式的尾數,符號位要參加右移並使自己保持不變。為減少誤差,可用
  另外的線路,保留右移過程中丟掉的一到幾位的高位值,供以後捨入操作使用。

  (2) 實現尾數的加(減)運算,對兩個完成對階後的浮點數執行求和(差)操作。

  (3) 規格化處理,若得到的結果不滿足規格化規則,就必須把它變成規格化的數,對雙符號位的補碼尾數來說,就必須是001××…×或
 
  110××…×的形式。這裡的規格化處理規則是:
  .當結果尾數的兩個符號位的值不同時,表明尾數運算結果溢出。此時應使結果尾數右移一位,並使階碼的值加1,這被稱為向右規格化,簡稱右規。

  .當尾數的運算結果不溢出,但最高數值位與符號位同值,表明不滿足規格化規則,此時應重復地使尾數左移、階減減1,直到出現在最高數值位上的值與符號位的值不同為止,這是向左規格化的操作,簡稱左規。

  (4) 捨入操作。在執行對階或右規操作時,會使尾數低位上的一位或多位的數值被移掉,使數值的精度受到影響,可以把移掉的幾個高位的值保存起來供捨入使用。捨入的總的原則是要有捨有入,而且盡量使捨和入的機會均等,以防止誤差積累。常用的辦法有"0"捨"1"入法,即移掉的最高位為1時 則在尾數末位加1;為0時則捨去移掉的數值。該方案的最大誤差為2-(n+1)。這樣做可能又使尾數溢出,此時就要再做一次右規。另一種方法 "置1"法,即右移時,丟掉移出的原低位上的值,並把結果的最低位置成1。該方案同樣有使結果尾數變大或變小兩種可能。即捨入前尾數最低位已為0,使其變1,對正數而言,其值變大,等於最低位入了個1。若尾數最低位已為1,則再對其置1無實際效用,等於捨掉了丟失的尾數低位值。

  (5) 判結果的正確性,即檢查階碼是否溢出。浮點數的溢出是以其階碼溢出表現出來的。在加減運算真正結束前,要檢查是否產生了溢出,若階碼正常,加(減)運算正常結束;若階碼下溢,要置運算結果為浮點形式的機器零,若上溢,則置溢出標志。


圖2.21 規格化浮點加減運算流程


  看一個浮點數加法運算的實例。
  假定 X=2010 * 0.11011011, Y=2100 * (-0.10101100)則它們的浮點表示分別為
         階符  階碼  數符  尾數
     [X] = 00   010   00  11011011
     [Y] = 00   100   11  01010100
           補碼      補碼

  執行X+Y的過程如下:
  (1)求階差和對階
   △ E = Ex-Ey = [Ex] +[-Ey] = 00 010 + 11 100 = 11 110即△E 為-2,
X的階碼小,應使Mx右移兩位,Ex加2, 得[X] = 00 100 00 00110110 11

  (2)尾數求和
     00 00110110
    + 11 01010100
    
     11 10001010

 

  (3)規格化處理
  結果的符號位與最高數值位同值,應執行左規處理,結果為11 00010101 10, 階碼為00 011。

  (4)捨入處理
  采用0捨1入法處理,則有
     11 00010101
    +      1
    
     11 00010110

  (5)判溢出
  階碼符號位為00.不溢出,故得最終結果為 X+Y = 2011 *(-0.11101010)

Copyright © Linux教程網 All Rights Reserved