計(jì)算機(jī)也需要運(yùn)算和存儲(chǔ)數(shù)學(xué)中的實(shí)數(shù)。在計(jì)算機(jī)的發(fā)展過(guò)程中,,曾產(chǎn)生過(guò)多種存儲(chǔ)實(shí)數(shù)的方式,,有的現(xiàn)在已經(jīng)很少使用了。不管如何存儲(chǔ),,我們都可以劃分為定點(diǎn)實(shí)數(shù)存儲(chǔ)方式和浮點(diǎn)實(shí)數(shù)存儲(chǔ)方式這兩種,。所謂定點(diǎn)實(shí)數(shù),就是約定整數(shù)位和小數(shù)位的長(zhǎng)度,,比如用4字節(jié)存儲(chǔ)實(shí)數(shù),,我們可以約定兩個(gè)高字節(jié)存放整數(shù)部分,兩個(gè)低字節(jié)存儲(chǔ)小數(shù)部分,。這樣的好處是計(jì)算的效率高,,缺點(diǎn)也顯而易見(jiàn),存儲(chǔ)不靈活,,比如我們想存儲(chǔ)65536.5,由于整數(shù)的表達(dá)范圍超過(guò)了2字節(jié),,用定點(diǎn)實(shí)數(shù)存儲(chǔ)方式就無(wú)法實(shí)現(xiàn)了,。對(duì)應(yīng)地,也有浮點(diǎn)實(shí)數(shù)存儲(chǔ)方式,,道理很簡(jiǎn)單,,就是用一部分二進(jìn)制位存放小數(shù)點(diǎn)的位置信息,我們可以稱之為“指數(shù)域”,,其他的數(shù)據(jù)位用來(lái)存儲(chǔ)沒(méi)有小數(shù)點(diǎn)時(shí)的數(shù)據(jù)和符號(hào),,我們可以稱之為“數(shù)據(jù)域”、“符號(hào)域”,。在訪問(wèn)時(shí)取得指數(shù)域,,與數(shù)據(jù)域運(yùn)算后得到真值,如67.625,,利用浮點(diǎn)實(shí)數(shù)存儲(chǔ)方式,,數(shù)據(jù)域可以記錄為67625,小數(shù)點(diǎn)的位置可以記為10的-3次方,,對(duì)該數(shù)進(jìn)行訪問(wèn)時(shí)計(jì)算一下即可,。浮點(diǎn)實(shí)數(shù)存儲(chǔ)方式的優(yōu)缺點(diǎn)和定點(diǎn)實(shí)數(shù)存儲(chǔ)方式的優(yōu)缺點(diǎn)是相反的。在80286之前,程序員常常為實(shí)數(shù)的計(jì)算傷腦筋,,而后來(lái)推出了浮點(diǎn)協(xié)處理器,,可協(xié)助主處理器分擔(dān)浮點(diǎn)運(yùn)算,程序員計(jì)算實(shí)數(shù)的效率也就提升了,,于是浮點(diǎn)實(shí)數(shù)存儲(chǔ)方式也就普及開(kāi)來(lái),,成為現(xiàn)在主流的實(shí)數(shù)存儲(chǔ)方式。但是,,在一些條件惡劣的嵌入式開(kāi)發(fā)場(chǎng)合,,仍可看到定點(diǎn)實(shí)數(shù)的存儲(chǔ)和使用。
在C/C++中,,使用浮點(diǎn)方式存儲(chǔ)實(shí)數(shù),,用兩種數(shù)據(jù)類型來(lái)保存浮點(diǎn)數(shù):float(單精度)、double(雙精度),。float在內(nèi)存中占4字節(jié)空間,,double在內(nèi)存中占用8字節(jié)空間。由于占用空間大,,double可描述的精度更高,。這兩種數(shù)據(jù)類型在內(nèi)存中同樣以十六進(jìn)制方式進(jìn)行存儲(chǔ),但與整型類型有所不同,。
整型類型是將十進(jìn)制轉(zhuǎn)換成二進(jìn)制保存在內(nèi)存中,,以十六進(jìn)制方式顯示。浮點(diǎn)類型并不是將一個(gè)浮點(diǎn)小數(shù)直接轉(zhuǎn)換成二進(jìn)制數(shù)保存,,而是將浮點(diǎn)小數(shù)轉(zhuǎn)換成的二進(jìn)制碼重新編碼,,再進(jìn)行存儲(chǔ)。C/C++的浮點(diǎn)數(shù)是有符號(hào)的,。
在C/C++中,,將浮點(diǎn)數(shù)強(qiáng)制轉(zhuǎn)換為整數(shù)時(shí),不會(huì)采用數(shù)學(xué)上四舍五入的方式,,而是舍棄掉小數(shù)部分(第4章會(huì)提到的“向0取整”),,不會(huì)進(jìn)位。
浮點(diǎn)數(shù)的操作不會(huì)用到通用寄存器,,而會(huì)使用浮點(diǎn)協(xié)處理器的浮點(diǎn)寄存器,,專門(mén)對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算處理,見(jiàn)2.2.2小節(jié),。MicrosoftVisualC++6.0在使用浮點(diǎn)數(shù)前,,需先對(duì)浮點(diǎn)寄存器進(jìn)行初始化,然后才能正常運(yùn)行,。未初始化浮點(diǎn)寄存器的代碼如代碼清單2-1所示,。
代碼清單2-1 未初始化浮點(diǎn)寄存器
int main(int argc, char* argv[])
{
// 在未使用到浮點(diǎn)數(shù)情況下,
// 在Visual C++ 6.0 中輸入小數(shù)會(huì)報(bào)錯(cuò),因沒(méi)有對(duì)浮點(diǎn)寄存器進(jìn)行初始化
int nInt = 0;
scanf("%f", &nInt);
}
在代碼清單2-1所示的運(yùn)行程序中輸入小數(shù)將會(huì)導(dǎo)致程序崩潰,,這是由于在浮點(diǎn)寄存器沒(méi)有初始化時(shí)使用浮點(diǎn)操作,,將無(wú)法轉(zhuǎn)換小數(shù)部分。
解決辦法是:在代碼中的任意位置定義一個(gè)浮點(diǎn)類型的變量即可對(duì)浮點(diǎn)寄存器進(jìn)行初始化