浮點數的運算步驟


浮點數的加減運算一般由以下五個步驟完成:對階尾數運算規格化舍入處理溢出判斷

一、對階

所謂對階是指將兩個進行運算的浮點數的階碼對齊的操作。對階的目的是為使兩個浮點數的尾數能夠進行加減運算。因為,當進行M x·2Ex與M y·2Ey加減運算時,只有使兩浮點數的指數值部分相同,才能將相同的指數值作為公因數提出來,然后進行尾數的加減運算。對階的具體方法是:首先求出兩浮點數階碼的差,即⊿E=E x-E y,將小階碼加上⊿E,使之與大階碼相等,同時將小階碼對應的浮點數的尾數右移相應位數,以保證該浮點數的值不變。幾點注意:

(1)對階的原則是小階對大階,之所以這樣做是因為若大階對小階,則尾數的數值部分的高位需移出,而小階對大階移出的是尾數的數值部分的低位,這樣損失的精度更小。

(2)若⊿E=0,說明兩浮點數的階碼已經相同,無需再做對階操作了。

(3)采用補碼表示的尾數右移時,符號位保持不變。

(4)由於尾數右移時是將最低位移出,會損失一定的精度,為減少誤差,可先保留若干移出的位,供以后舍入處理用。

二、尾數運算

尾數運算就是進行完成對階后的尾數相加減。這里采用的就是我們前面講過的純小數的定點數加減運算。

三、結果規格化

在機器中,為保證浮點數表示的唯一性,浮點數在機器中都是以規格化形式存儲的。對於IEEE754標准的浮點數來說,就是尾數必須是1.M的形式。由於在進行上述兩個定點小數的尾數相加減運算后,尾數有可能是非規格化形式,為此必須進行規格化操作。

規格化操作包括左規和右規兩種情況。

左規操作:將尾數左移,同時階碼減值,直至尾數成為1.M的形式。例如,浮點數0.0011·25是非規格化的形式,需進行左規操作,將其尾數左移3位,同時階碼減3,就變成1.1100·22規格化形式了。

右規操作:將尾數右移1位,同時階碼增1,便成為規格化的形式了。要注意的是,右規操作只需將尾數右移一位即可,這種情況出現在尾數的最高位(小數點前一位)運算時出現了進位,使尾數成為10.xxxx或11.xxxx的形式。例如,10.0011·25右規一位后便成為1.00011·26的規格化形式了。

四、 舍入處理

浮點運算在對階或右規時,尾數需要右移,被右移出去的位會被丟掉,從而造成運算結果精度的損失。為了減少這種精度損失,可以將一定位數的移出位先保留起來,稱為保護位,在規格化后用於舍入處理。

IEEE754標准列出了四種可選的舍入處理方法:

(1)就近舍入(round to nearest)這是標准列出的默認舍入方式,其含義相當於我們日常所說的“四舍五入”。例如,對於32位單精度浮點數來說,若超出可保存的23位的多余位大於等於100…01,則多余位的值超過了最低可表示位值的一半,這種情況下,舍入的方法是在尾數的最低有效位上加1;若多余位小於等於011…11,則直接舍去;若多余位為100…00,此時再判斷尾數的最低有效位的值,若為0則直接舍去,若為1則再加1。

(2)朝+∞舍入(round toward +∞)對正數來說,只要多余位不為全0,則向尾數最低有效位進1;對負數來說,則是簡單地舍去。

(3)朝-∞舍入(round toward -∞)與朝+∞舍入方法正好相反,對正數來說,只是簡單地舍去;對負數來說,只要多余位不為全0,則向尾數最低有效位進1。

(4)朝0舍入(round toward 0)

即簡單地截斷舍去,而不管多余位是什么值。這種方法實現簡單,但容易形成累積誤差,且舍入處理后的值總是向下偏差。

五、 溢出判斷

與定點數運算不同的是,浮點數的溢出是以其運算結果的階碼的值是否產生溢出來判斷的。若階碼的值超過了階碼所能表示的最大正數,則為上溢,進一步,若此時浮點數為正數,則為正上溢,記為+∞,若浮點數為負數,則為負上溢,記為-∞;若階碼的值超過了階碼所能表示的最小負數,則為下溢,進一步,若此時浮點數為正數,則為正下溢,若浮點數為負數,則為負下溢。正下溢和負下溢都作為0處理。

要注意的是,浮點數的表示范圍和補碼表示的定點數的表示范圍是有所不同的,定點數的表示范圍是連續的,而浮點數的表示范圍可能是不連續的。

六、例子

float a=0.3;b=1.6;

a=(0.3)10=(0011 1110 1001 1001 1001 1001 1001 1010)2    Sa=0    Ea=011 1110 1    Ma=1.001 1001 1001 1001 1001 1010

b=(1.6)10=(0011 1111 1100 1100 1100 1100 1100 1101)2      Sb=0    Eb=011 1111 1     Mb=1.100 1100 1100 1100 1100 1101

a+b=?

第一步:對階

∵ Ea<Eb   Eb-Ea=2

∴ Ma要調整為 0.0 1001 1001 1001 1001 1001 10       10

   E=011 1111 1

第二步:尾數運算

    0.01001100110011001100110

+  1.10011001100110011001101

    1.11100110011001100110011‬

第三步:規格化

1.11100110011001100110011‬已經是個規格化數據了

第四步:舍入處理

由於在對階時,Ma有右移,且第一次最高為1,第二次為0,所以按"0舍1入",尾數運算結果調整為 1.11100110011001100110100

第五步:溢出判斷

沒有溢出,階碼不調整,所以最后的結果為

a+b=(0  01111111  11100110011001100110100)2=(0011 1111 1111 0011 0011 0011 0011 0100)2=(3FF33334)16

轉為10進制

a+b=1.90000010

b-a=?

第一步:對階

跟上面加法一樣

第二步:尾數運算

   1.10011001100110011001101           

-  0.01001100110011001100110

   1.01001100110011001100111

第三步:規格化

1.01001100110011001100111已經是個規格化數據了

第四步:舍入處理

由於在對階時,Ma有右移,且第一次最高為1,第二次為0,所以按"0舍1入",尾數運算結果調整為 1.01001100110011001100110

第五步:溢出判斷

沒有溢出,階碼不調整,所以最后的結果為

a-b=(0  01111111  01001100110011001100110)2=(0011  1111  1010  0110  0110  0110  0110  0110)2=(3FA66666)16

轉為10進制

a-b=1.29999995

 

付:浮點運算加法器邏輯電路

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM