1. 浮點加減法的運算步驟
前面已講到,浮點數經常被寫成如下的形式:
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)
浮點數的加減法運算
浮點數與定點數相比較有兩個比較明顯地特點 1 小數點位置不固定,但是在浮點數加減法運算的時候,小數點必須對齊 2 儲存器中儲存的不是浮點數的直接值,而儲存的是符號,尾數,移碼 階碼三種要素,所以不能直接相加減,實際上,針對浮點數的加減法運算,只需要對代表浮點數有效部分的尾數進行加減運算。所以,浮點數...
浮點數加(減)法 乘法 除法運算
ieee754標準規定了3種浮點數格式 單精度 雙精度與擴充套件精度 ieee754標準從邏輯上用三元組表示乙個數n,對於雙精度而言,其編碼格式為1位符號位,11位階碼和52位尾數 n 1 s x 2 e 1023 x 1.m 1 浮點數的加減法運算 加減法的本質相同,減法可以通過對減數的符號位取反...
浮點數精確加減法,保留精度
在用php做漸漸發的時候一定要注意,浮點數直接相加減會造成精度丟失,這時候需要使用精度函式 bcadd 2個任意精度數字的加法計算 bccomp 比較兩個任意精度的數字 bcdiv 2個任意精度的數字除法計算 bcmod 對乙個任意精度數字取模 bcmul 2個任意精度數字乘法計算 bcpow 任意...