柴曉東
(黃河科技學(xué)院國(guó)際學(xué)院,河南鄭州 450063)
計(jì)算機(jī)中的浮點(diǎn)數(shù)是小數(shù)點(diǎn)的位置不固定,可以浮動(dòng)的數(shù)據(jù)。浮點(diǎn)數(shù)的引入,不僅擴(kuò)大了數(shù)據(jù)的表示范圍,同時(shí)也提高數(shù)據(jù)的分辨精度。浮點(diǎn)數(shù)的表示方法類(lèi)似于十進(jìn)制科學(xué)標(biāo)識(shí)法,就是用符號(hào)、一串有效數(shù)字(通常稱(chēng)作尾數(shù))以及對(duì)應(yīng)于比例因子中隱含基數(shù)的指數(shù)來(lái)表示一個(gè)數(shù)[1]。浮點(diǎn)數(shù)可表示為:N=2E·M。其中E是階碼,常用移碼表示,它決定了浮點(diǎn)數(shù)的表示范圍。M是尾數(shù),是定點(diǎn)純小數(shù),它給出了有效數(shù)字的位數(shù),決定了浮點(diǎn)數(shù)的分辨精度。
計(jì)算機(jī)中浮點(diǎn)數(shù)的加減運(yùn)算步驟主要有:對(duì)階、尾數(shù)運(yùn)算、規(guī)格化處理、舍入處理以及溢出處理。對(duì)階就是通過(guò)移動(dòng)尾數(shù),使要進(jìn)行加減運(yùn)算的兩個(gè)浮點(diǎn)數(shù)的階碼相等。尾數(shù)運(yùn)算就是將對(duì)階后的浮點(diǎn)數(shù)尾數(shù),按照運(yùn)算規(guī)則,進(jìn)行求和運(yùn)算。規(guī)格化處理就是將運(yùn)算結(jié)果通過(guò)一定的方法,變換成統(tǒng)一的標(biāo)準(zhǔn)格式。舍入處理就是根據(jù)運(yùn)算要求,對(duì)運(yùn)算結(jié)果中,多出保留位的數(shù)值進(jìn)行丟棄或進(jìn)位處理。溢出處理就是對(duì)運(yùn)算結(jié)果中,可能產(chǎn)生的階碼溢出,或尾數(shù)溢出進(jìn)行相應(yīng)的處理。在以上運(yùn)算步驟中,尾數(shù)的規(guī)格化處理、舍入處理以及溢出處理,都屬于尾數(shù)處理部分。
浮點(diǎn)數(shù)進(jìn)行運(yùn)算后,若不對(duì)浮點(diǎn)數(shù)的表示做出明確規(guī)定,同一個(gè)浮點(diǎn)數(shù)的表示就不是惟一的[2]。為了充分利用尾數(shù)的位數(shù)來(lái)表示更多的有效數(shù)字,以提高數(shù)據(jù)的分辨精度,通常采用浮點(diǎn)數(shù)規(guī)格化形式。規(guī)格化就是將尾數(shù)的絕對(duì)值限定在某個(gè)范圍內(nèi),使尾數(shù)部分的絕對(duì)值盡可能以最大值的形式出現(xiàn)。規(guī)格化浮點(diǎn)數(shù)的尾數(shù)應(yīng)滿(mǎn)足條件:0.5≤│M│<1。
浮點(diǎn)數(shù)規(guī)格化的表示形式與尾數(shù)采用何種編碼有關(guān)。
當(dāng)尾數(shù)用原碼表示時(shí),若0≤M,尾數(shù)規(guī)格化形式為:M=0.1XX…XX。若0>M,尾數(shù)規(guī)格化形式為:M=1.1XX…XX。其中X為0或1,以下相同。即當(dāng)尾數(shù)為正數(shù)時(shí),其規(guī)格化形式要求,尾數(shù)小數(shù)點(diǎn)后第一位的值為1;當(dāng)尾數(shù)為負(fù)數(shù)時(shí),尾數(shù)小數(shù)點(diǎn)后第一位的值為1。
當(dāng)尾數(shù)用補(bǔ)碼表示時(shí),若0≤M,尾數(shù)規(guī)格化形式為:M=0.1XX…XX。若0>M,尾數(shù)規(guī)格化形式為:M=1.0XX…XX。即當(dāng)尾數(shù)為正數(shù)時(shí),其規(guī)格化形式要求,尾數(shù)小數(shù)點(diǎn)后第一位的值為1;當(dāng)尾數(shù)為負(fù)數(shù)時(shí),尾數(shù)小數(shù)點(diǎn)后第一位的值為0。
綜上所述,浮點(diǎn)數(shù)的規(guī)格化,其實(shí)質(zhì)就是為了保證尾數(shù)所對(duì)應(yīng)的真值小數(shù)點(diǎn)后第一位的值為1。當(dāng)浮點(diǎn)加減運(yùn)算的結(jié)果不是規(guī)格化的形式時(shí),需要進(jìn)行左規(guī)或者右規(guī)將它轉(zhuǎn)化為規(guī)格化形式。雙符號(hào)數(shù)補(bǔ)碼規(guī)格化形式為:M=00.1XX…XX或M=11.0XX…XX。規(guī)格化方法是:
1.若加減運(yùn)算結(jié)果的兩個(gè)符號(hào)位不同,如01.XXX…XX或10.XXX…XX,表明運(yùn)算結(jié)果發(fā)生了溢出,此時(shí)需將尾數(shù)右移1位(小數(shù)點(diǎn)左移1位),階碼加1,即進(jìn)行右規(guī)。例如,若加減運(yùn)算結(jié)果是01.110111,階碼為10,規(guī)格化需要右規(guī)1位,階碼加1,規(guī)格化后的形式為00.1110111,階碼變?yōu)?1;若加減運(yùn)算結(jié)果是10.110111,階碼為10,規(guī)格化需要右規(guī)1位,階碼加1,規(guī)格化后的形式為11.0110111,階碼變?yōu)?1。
2.若加減運(yùn)算結(jié)果的兩個(gè)符號(hào)位相同,但最高數(shù)值位與符號(hào)位相同,如00.0XX…XX或11.1XX…XX,此時(shí)需將尾數(shù)左移(小數(shù)點(diǎn)右移),直至轉(zhuǎn)化為00.1XX…XX或11.0XX…XX的形式,階碼減去尾數(shù)左移的位數(shù),即進(jìn)行左規(guī)。例如,若加減運(yùn)算結(jié)果是00.010111,階碼為11,則規(guī)格化需要左規(guī)1位,階碼減1,規(guī)格化后的形式為00.101110,階碼變?yōu)?0;若加減運(yùn)算結(jié)果是11.110111,階碼為11,則規(guī)格化需要左規(guī)2位,階碼減2,規(guī)格后的化形式為11.011100,階碼變?yōu)?1。
為了便于軟件的移植,浮點(diǎn)數(shù)的表示形式應(yīng)該有統(tǒng)一的標(biāo)準(zhǔn)。IEEE(Institute of Electrical and Electronics Engineers)提出了IEEE754標(biāo)準(zhǔn)。IEEE754標(biāo)準(zhǔn)規(guī)定基數(shù)為2,符號(hào)S用0或1表示,階碼E用移碼表示,尾數(shù)M用原碼表示。如圖1所示為IEEE754標(biāo)準(zhǔn)32位浮點(diǎn)數(shù)和64位浮點(diǎn)數(shù)的格式。
圖1 IEEE754浮點(diǎn)數(shù)格式
對(duì)于IEEE754標(biāo)準(zhǔn)的浮點(diǎn)數(shù),由于其尾數(shù)M用原碼表示,因此,其規(guī)格化方法與原碼規(guī)格化方法相同。根據(jù)原碼的規(guī)格化方法,尾數(shù)小數(shù)點(diǎn)后第一位的值為1,規(guī)格化后,尾數(shù)M的最高位應(yīng)該是1。對(duì)于32位浮點(diǎn)數(shù),尾數(shù)M的范圍是0~22位,規(guī)格化后,尾數(shù)M最高位應(yīng)該為1,即第22位應(yīng)該為1。對(duì)于64位浮點(diǎn)數(shù),尾數(shù)M的范圍是0~51位,規(guī)格化后,第51位應(yīng)該是1。因浮點(diǎn)數(shù)規(guī)格化后,尾數(shù)M最高有效位固定為1,即尾數(shù)M最左位固定為1,IEEE754標(biāo)準(zhǔn)將這個(gè)1缺省存儲(chǔ),即不存儲(chǔ),而隱藏在二進(jìn)制小數(shù)點(diǎn)的左邊。這樣M域中存儲(chǔ)的23位和52位實(shí)際上只表示了尾數(shù)的小數(shù)部分,即小數(shù)點(diǎn)右方的各位。
圖2所示為IEEE754標(biāo)準(zhǔn)32位浮點(diǎn)數(shù)的規(guī)格化。其中(a)圖表示是一個(gè)非規(guī)格化數(shù)+0.0001101…×27的IEEE754標(biāo)準(zhǔn)格式,其中階碼用移碼表示。階碼原始是9,變?yōu)橐拼a后為7+127,二進(jìn)制為10000110。尾數(shù)域的數(shù)據(jù)為0.0001101…。將尾數(shù)0.0001101…規(guī)格化,按照原碼規(guī)格化方法,左規(guī)3位,規(guī)格化后變?yōu)?.1101…,階碼減3,變?yōu)?。由于IEEE754標(biāo)準(zhǔn)規(guī)定,尾數(shù)域最高位隱藏不存儲(chǔ),即小數(shù)點(diǎn)左邊應(yīng)該為1,則需要對(duì)規(guī)格化后的值再次進(jìn)行變換,即小數(shù)點(diǎn)向右再次移動(dòng)1位,變?yōu)?.101…,階碼再減1,變?yōu)?。階碼用移碼表示為3+127,二進(jìn)制表示形式為10000010。尾數(shù)域數(shù)據(jù)為101…。(b)圖表示的即為規(guī)格化后的IEEE754標(biāo)準(zhǔn)格式。其中最高位0是符號(hào)位,表示“+”。
事實(shí)上,IEEE754標(biāo)準(zhǔn)浮點(diǎn)數(shù)規(guī)格化后,尾數(shù)域的數(shù)據(jù)只是小數(shù)點(diǎn)后的數(shù)據(jù),實(shí)際上尾數(shù)表示范圍比實(shí)際存儲(chǔ)的多一位,這一位就是小數(shù)點(diǎn)前的一位1。
圖2 IEEE754標(biāo)準(zhǔn)32位浮點(diǎn)數(shù)規(guī)格化
在浮點(diǎn)運(yùn)算中,在執(zhí)行右規(guī)或?qū)﹄A時(shí),尾數(shù)低位上的數(shù)值會(huì)因?yàn)槌鰴C(jī)器的允許位數(shù)而被移掉,從而使數(shù)值的精度受到影響。為了減小數(shù)據(jù)的誤差,需要對(duì)移掉的數(shù)據(jù)進(jìn)行舍入處理。計(jì)算機(jī)中常用的舍入方法有兩種:四舍五入法和截?cái)嗵幚矸ā?/p>
四舍五入法類(lèi)似于十進(jìn)制的四舍五入,即尾數(shù)超出規(guī)定的保留位的多余位數(shù)值,若大于規(guī)定的保留位的最低有效位值的一半時(shí),則需要進(jìn)位,即在尾數(shù)保留位的最低有效位上加1。若超出規(guī)定的保留位的多余位數(shù)的值,小于規(guī)定的保留位的最低有效位值的一半時(shí),則直接舍去。例如,若要進(jìn)行舍入處理的數(shù)據(jù)為0.11011001,要求保留位為4位。則進(jìn)行舍入處理的多余數(shù)據(jù)為1001,由于1001大于1000,因此需要向高位進(jìn)位。將0.1101的末位直接加1,即0.1101+0.0001=0.1110,舍入處理結(jié)果為0.1110;若要進(jìn)行舍入處理的數(shù)據(jù)為0.11010001,要求保留位為4位。則進(jìn)行舍入處理的多余數(shù)據(jù)為0001,由于0001小于1000,因此需要舍去。直接將0001舍去,保持其它數(shù)值不變,舍入處理結(jié)果為0.1101。
對(duì)于多余位剛好等于有效位值的一半時(shí),分兩種情況處理:當(dāng)規(guī)定的保留位的最低有效位為0時(shí),則直接舍去;若規(guī)定的保留位的最低有效位為1時(shí),則向高位進(jìn)一位使其變?yōu)?。例如,若要進(jìn)行舍入處理的數(shù)據(jù)為0.11001000,要求保留位為4位。保留位的最低有效位為0,則直接舍去多余位1000。舍入處理結(jié)果為0.1100。若要進(jìn)行舍入處理的數(shù)據(jù)為0.11011000,要求保留位為4位。保留位的最低有效位為1,則向保留位的最低位加1,即0.1101+0.0001=0.1110,舍入處理結(jié)果為0.1110。
四舍五入法的舍入結(jié)果最接近于被舍入處理的數(shù)據(jù),而且是無(wú)偏近似。但該方法要求一次加法運(yùn)算,有可能需要對(duì)舍入結(jié)果再次進(jìn)行規(guī)格化。這種舍入方式是IEEE浮點(diǎn)標(biāo)準(zhǔn)舍入處理的默認(rèn)模式。
截?cái)嗵幚矸ㄊ且环N簡(jiǎn)單的方法,直接將超出規(guī)定的保留位的多余位舍去,而剩余的規(guī)定的保留位則保持不變。例如,若要進(jìn)行舍入處理的數(shù)據(jù)為0.11011001,要求保留位為4位。則進(jìn)行舍入處理的多余數(shù)據(jù)為1001,直接將多余位1001舍去即可。舍入處理結(jié)果為0.1101。截?cái)嗵幚矸椒ú僮骱?jiǎn)單,但誤差相對(duì)較大,影響結(jié)果的精度。
在浮點(diǎn)運(yùn)算過(guò)程中,需要檢測(cè)計(jì)算結(jié)果是否發(fā)生溢出。如果溢出,需要進(jìn)行溢出處理。溢出有兩種,一種是階碼溢出,另一種是尾數(shù)溢出。
階碼的溢出有兩種情況,一種是兩個(gè)同符號(hào)數(shù)據(jù)相加,由于一個(gè)數(shù)據(jù)的絕對(duì)值很大,已經(jīng)使正階碼達(dá)到最大值,兩數(shù)相加規(guī)格化后,階碼需要增加,這時(shí)發(fā)生階碼上溢。另一種是兩個(gè)不同符號(hào)數(shù)據(jù)相加,由于兩個(gè)數(shù)據(jù)的絕對(duì)值很小,兩數(shù)相加規(guī)格化后,階碼需要減少,這時(shí)發(fā)生階碼下溢[3]。
尾數(shù)的溢出也有兩種情況,一種是兩個(gè)同符號(hào)數(shù)據(jù)相加,出現(xiàn)相加結(jié)果最高位向上進(jìn)位,需要將尾數(shù)右移,階碼加1。即對(duì)計(jì)算結(jié)果進(jìn)行右規(guī)格化處理。另一種是兩個(gè)數(shù)據(jù)運(yùn)算后,數(shù)據(jù)長(zhǎng)度超出了要求的數(shù)據(jù)長(zhǎng)度,這時(shí)需要對(duì)計(jì)算結(jié)果進(jìn)行舍入處理。由于浮點(diǎn)數(shù)的表示范圍很廣,在實(shí)際應(yīng)用中,階碼的溢出很少出現(xiàn),但尾數(shù)的溢出出現(xiàn)較多。
[1]Carl Hamacher等.計(jì)算機(jī)組成[M].北京:機(jī)械工業(yè)出版社,2004.
[2]白中英.計(jì)算機(jī)組成原理(第四版)[M].北京:科學(xué)出版社,2008.
[3]羅克露,劉輝等.計(jì)算機(jī)組成原理(第二版)[M].北京:電子工業(yè)出版社,2010.
湖南廣播電視大學(xué)學(xué)報(bào)2014年3期