小數(shù)的存儲——選自《計算機(jī)科學(xué)概論》
這本書對于入門級的人來說是一個不錯的選擇,它囊括了很多關(guān)于計算機(jī)方面的知識,能夠使你對這方面的知識有個廣泛的了解。
對于小數(shù)的存儲常用的是浮點記數(shù)法。
浮點記數(shù)法簡介
對于知識的掌握,通過例子的學(xué)習(xí)是一個很好的方式。為了考慮到例子的簡易型,用一個字節(jié)來存儲浮點數(shù)。那么如01101011這樣的二進(jìn)制序列表示的是什么小數(shù)呢?
一個字節(jié)中浮點記數(shù)法有如下成分:
在01101011這么一個串中,符號位是0表示非負(fù),1則表示負(fù),指數(shù)為110,表示位數(shù)將乘以2^(指數(shù)),也就是將小數(shù)點從尾數(shù)位的最左邊移動指數(shù)個位,如果指數(shù)為正,向右移動;反之,向左移動指數(shù)位。110是用余碼的方式進(jìn)行記錄的。對于余碼,我采用的解析的方式是,將最高為取反,按照補碼的方式進(jìn)行讀取。
110--->010,表示2;0100--->1100,表示-4;
既然提到了補碼,就解釋一下補碼,最高位為零的補碼其值直接讀取,0110--->6;最高為為1的補碼,其值的讀取方式,從右往左遇到第一個1之后的所有位取反,讀出值后加個負(fù)號,1101--->0011,則-3。當(dāng)然對于0和最小的負(fù)數(shù),不適合上述的方式,但是也很容易就能給出其值。
再讓我們回到0,110,1011這個串中,尾數(shù).1011最左斷含有一個小數(shù)點,由于110--->2,因此小數(shù)點向右移動兩位則10.11,此時讀取值2+1/2+1/4=2又3/4。
至此,我們已經(jīng)知道小數(shù)是如何存儲在二進(jìn)制串中,也知道了如何將其轉(zhuǎn)換為10進(jìn)制數(shù)值,那么該提出注意事項的時候了。
1. 規(guī)范化形式
尾數(shù)最左端的一位必須是1,否則會出現(xiàn)多意的現(xiàn)象。如00111100,01000110,都可以解碼為3/8。
2. 截斷誤差
整型值會出現(xiàn)溢出現(xiàn)象,同樣浮點數(shù)也會出現(xiàn)類似的現(xiàn)象。如利用一字節(jié)浮點記數(shù)法存儲值2又5/8,先用二進(jìn)制進(jìn)行表示10.101,而尾數(shù)只有4位,因此會出現(xiàn)截斷。
還有一個需要注意的是浮點記數(shù)法表示的數(shù)值加法中,它們相加的順序很重要。
如,2+1/4+1/8+1/8+1/8+1/8,當(dāng)?shù)?(5/8)+1/8時,2(5/8)用二進(jìn)制表示為10.101,這將發(fā)生截斷,變成10.10,繼續(xù)加1/8則會持續(xù)階段。當(dāng)反過來進(jìn)行加法運算時,則不會出現(xiàn)截斷的現(xiàn)象。
由于實際浮點數(shù)具有較長的位數(shù),能夠較好的運用于一般的浮點數(shù)運算中。但是這樣的問題在一些應(yīng)用中是很嚴(yán)重的(如航海系統(tǒng)),小的誤差在不斷的加法運算中累加,最終產(chǎn)生嚴(yán)重的后果,因此對于精度要求較好的運算中,可以選擇采用分?jǐn)?shù)表示法,分裝一個表示分?jǐn)?shù)的類。

