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