田祎 樊景博
摘 要:浮點(diǎn)數(shù)是C語(yǔ)言中的一種數(shù)據(jù)類(lèi)型,但在標(biāo)準(zhǔn)C中并沒(méi)有給出其具體的描述,即數(shù)的存儲(chǔ)格式及表示范圍。部分經(jīng)典的C語(yǔ)言程序設(shè)計(jì)教程中給出了浮點(diǎn)數(shù)的表示范圍,但存在不嚴(yán)謹(jǐn)和值得商榷的地方。結(jié)合IEEE754標(biāo)準(zhǔn),就C語(yǔ)言中浮點(diǎn)數(shù)內(nèi)在存儲(chǔ)格式進(jìn)行分析并給出結(jié)論。
關(guān)鍵詞:C語(yǔ)言;浮點(diǎn)數(shù);表示范圍
中圖分類(lèi)號(hào):TP313 文獻(xiàn)標(biāo)識(shí)碼:A
Abstract:The float is a data type in C language,but its in standard C and did not give a specific of description:that is the number of storage format and the scope of representation.Part of classically C language programming tutorial gives a range of floating-point represent,but there is not rigorous and need to discussion.Combined IEEE754 standards,provided analyzation and conclusions in C language in internal storage floating-point format.
Keywords:C language;floating-point;scope of representation
1 引言(Introduction)
浮點(diǎn)數(shù)運(yùn)算是科學(xué)計(jì)算必須面對(duì)的問(wèn)題,由于計(jì)算機(jī)內(nèi)部本身不能精確地處理某些整數(shù)或小數(shù),因此在運(yùn)算時(shí)可能存在較大的誤差,運(yùn)算結(jié)果將直接影響到系統(tǒng)的可靠性和安全性等。C語(yǔ)言因功能強(qiáng)大、程序設(shè)計(jì)靈活且支持底層應(yīng)用,在科學(xué)計(jì)算、數(shù)據(jù)處理等領(lǐng)域中得到了廣泛應(yīng)用,但C語(yǔ)言在浮點(diǎn)數(shù)運(yùn)算方面也存在數(shù)據(jù)表示的不精確性等問(wèn)題。經(jīng)典C語(yǔ)言并沒(méi)有對(duì)浮點(diǎn)數(shù)專(zhuān)門(mén)說(shuō)明,國(guó)內(nèi)很多教材雖述及浮點(diǎn)數(shù),但也只是給出表示范圍,對(duì)于浮點(diǎn)數(shù)的解釋尚不夠充分,描述尚不夠嚴(yán)謹(jǐn),因此學(xué)生在對(duì)浮點(diǎn)數(shù)的學(xué)習(xí)過(guò)程中經(jīng)常存在這樣或那樣理解上的困惑。這里就浮點(diǎn)數(shù)的表示范圍,結(jié)合IEEE754做進(jìn)一步的分析,為以后浮點(diǎn)數(shù)教學(xué)和學(xué)習(xí)給出參考[1]。
2 浮點(diǎn)數(shù)的表示及范圍(The range of floating-point and representation)
總體而言,浮點(diǎn)數(shù)的表示形式一般格式指滿足一般的二進(jìn)制數(shù)機(jī)器碼(包括定點(diǎn)整數(shù)和定點(diǎn)小數(shù))的規(guī)定規(guī)則;而IEEE754[2]格式則在一般格式上進(jìn)一步做了一些約定,以便表示數(shù)時(shí)比較方便和高效。
(1)一般表示法
其主要有兩種格式,分別如圖1和圖2所示。
一般浮點(diǎn)數(shù)尾數(shù)采用純小數(shù)(隱含位為0)來(lái)表示,即尾數(shù)M與定點(diǎn)小數(shù)表示方法相同,由于尾數(shù)的符號(hào)位決定整個(gè)浮點(diǎn)數(shù)的符號(hào),故有時(shí)采用圖2的形式;當(dāng)尾數(shù)真值為0(不論階碼何值),或階碼的值比能在機(jī)器中表示的最小值還小,計(jì)算機(jī)把該浮點(diǎn)數(shù)看成零值,稱為機(jī)器零,即浮點(diǎn)數(shù)表示不了真值絕對(duì)值很接近0的數(shù),只能看成0處理;尾數(shù)通常用原碼或補(bǔ)碼表示,階碼一般用移碼或補(bǔ)碼表示。因此其表示范圍如圖3所示。
3 C語(yǔ)言中浮點(diǎn)數(shù)的表示(C language representation of floating point numbers)
C語(yǔ)言所使用的浮點(diǎn)數(shù)符合IEEE754標(biāo)準(zhǔn),該標(biāo)準(zhǔn)在1985年審核通過(guò),目的是讓遵守IEEE標(biāo)準(zhǔn)的機(jī)器之間運(yùn)行的程序可以相互直接移植,另外也讓程序員可以輕松寫(xiě)出有用的、魯棒的浮點(diǎn)數(shù)應(yīng)用程序。
3.1 IEEE754
IEEE標(biāo)準(zhǔn)從邏輯上用三元組{S,E,M}表示一個(gè)數(shù)N[3],如圖4所示。
IEEE標(biāo)準(zhǔn)754規(guī)定了三種浮點(diǎn)數(shù)格式:?jiǎn)尉?、雙精度、擴(kuò)展精度,分別對(duì)應(yīng)C語(yǔ)言里頭的float、double和long double。不同的編譯系統(tǒng)對(duì)long double型的處理方法不同,Turbo c分配16個(gè)字節(jié),而Visual C++6.0則分配8個(gè)字節(jié)。
單精度:N共32位,其中S占1位、E占8位、M占23位,如圖5所示。
M雖然是23位或者52位,但它們只是表示小數(shù)點(diǎn)之后的二進(jìn)制位數(shù),也就是說(shuō),假定 M為“010110011...”,在二進(jìn)制數(shù)值上其實(shí)是“.010110011...”。而事實(shí)上,標(biāo)準(zhǔn)規(guī)定小數(shù)點(diǎn)左邊還有一個(gè)隱含位[4],絕大多數(shù)情況下是1,當(dāng)N對(duì)應(yīng)的n非常小的時(shí)候,比如小于2^(-126)(32位單精度浮點(diǎn)數(shù)),于是M對(duì)應(yīng)的m最后結(jié)果可能是“m=1.010110011...”或者“m=0.010110011...”。
3.2 楊路明先生教材中對(duì)實(shí)數(shù)類(lèi)型的描述
楊路明先生在其主編的《C語(yǔ)言程序設(shè)計(jì)教程》是這樣描述實(shí)數(shù)類(lèi)型的:實(shí)數(shù)類(lèi)型的數(shù)據(jù)即實(shí)型數(shù)據(jù),在C語(yǔ)言中實(shí)型數(shù)據(jù)又被稱為浮點(diǎn)型數(shù)據(jù)[1]。實(shí)型數(shù)據(jù)的值域在計(jì)算機(jī)中表示只是數(shù)學(xué)中實(shí)數(shù)的一個(gè)子集。Turbo C的實(shí)型數(shù)據(jù)又分為單精度型和雙精度型兩種,它們所占內(nèi)存字節(jié)數(shù)及取值范圍如表1所示。
3.3 存在問(wèn)題
根據(jù)以上描述,單精度數(shù)的取值范圍大約在-1038—1038;雙精度數(shù)的取值范圍大約-10308—10308,這個(gè)表述本身是沒(méi)有問(wèn)題的,但為了有利于基礎(chǔ)教學(xué),為學(xué)生建立一個(gè)正確的概念[5],認(rèn)為以上表述不夠精確。因?yàn)槲矓?shù)隱藏位值可能為1或者0,因此存在最小可以規(guī)格化的數(shù)。如果按標(biāo)準(zhǔn)規(guī)定隱藏位值為1,以上表述的取值范圍就過(guò)于籠統(tǒng),而且從最小可規(guī)格化的數(shù)到0的表示之間,也沒(méi)有任何形式的過(guò)渡。比如最小規(guī)格化的數(shù)再小一點(diǎn)的數(shù),便只能是0了,所以這種籠統(tǒng)的表示一方面不利于學(xué)生理解;另一方面,不能使學(xué)生真正明白為什么不能進(jìn)行浮點(diǎn)數(shù)判等。
4 結(jié)論(Conclusion)
浮點(diǎn)數(shù)的表示范圍與階碼和尾數(shù)的位數(shù)以及采用的浮點(diǎn)數(shù)表示格式有關(guān)。IEEE754標(biāo)準(zhǔn)中,單精度數(shù)所能表示的最大正規(guī)格化數(shù),其階碼和尾數(shù)的值分別為(11111110)b,(111 1111 1111 1111 1111 1111)b,該數(shù)二進(jìn)制數(shù)值為1.(23個(gè)1)×2127,而能表示的最小正規(guī)格化數(shù),其階碼和尾數(shù)部分的二進(jìn)制值分別為1和0,該數(shù)二進(jìn)制數(shù)值為1.(23個(gè)0)×2-126。同理可得,雙精度所能表示的最大正規(guī)格化數(shù)和最小正規(guī)格化數(shù),其二進(jìn)制數(shù)值分別為1.(51個(gè)1)×21023和1.(51個(gè)0)×21022。因此,在基礎(chǔ)課程教學(xué)中,應(yīng)將其表示如表2所示。
由表2學(xué)習(xí)者可清楚看到浮點(diǎn)數(shù)的表示范圍,并可得到兩個(gè)問(wèn)題,一是0如何表示,是否有正負(fù)0之分;二是在最小規(guī)格化數(shù)到0之間的數(shù)如何表示。
0的偏移指數(shù)為00…00b,有效數(shù)字段亦為00…00b。0的偏移指數(shù)是保留的,也就是說(shuō)0的偏移數(shù)不能用來(lái)表示正常的實(shí)數(shù)。并且,只有0做除數(shù)時(shí),0才有正負(fù)之分,否則正0和負(fù)0沒(méi)有區(qū)別。
當(dāng)N對(duì)應(yīng)的n非常小的時(shí)候,在最小規(guī)格化數(shù)到0之間,稱其為微小數(shù),比如小于2^(-126)(32位單精度浮點(diǎn)數(shù)),于是M對(duì)應(yīng)的m最后結(jié)果是m=0.010110011...,它的有效數(shù)字的最高位為0,這種表示為非規(guī)格化表示,引起精度丟失,但有效擴(kuò)展了能表示的非常小數(shù)的范圍。
《C程序設(shè)計(jì)》是理工類(lèi)專(zhuān)業(yè)學(xué)生步入計(jì)算機(jī)程序設(shè)計(jì)世界的第一門(mén)課程[5],建立科學(xué)嚴(yán)謹(jǐn)?shù)挠?jì)算機(jī)認(rèn)識(shí)觀尤為重要,而楊路明先生主編的《C語(yǔ)言程序設(shè)計(jì)教程》是C語(yǔ)言教學(xué)的經(jīng)典教材,在諸如以上討論的方面有值得商榷的地方,應(yīng)該給予必要的論述,促使學(xué)生深入理解計(jì)算機(jī)的內(nèi)部世界[6],為學(xué)生步入計(jì)算機(jī)世界打下一個(gè)良好的基礎(chǔ)。
參考文獻(xiàn)(References)
[1] 楊路明.C語(yǔ)言程序設(shè)計(jì)教程[M].北京:北京郵電大學(xué)出版社,2008.
[2] 唐朔飛.計(jì)算機(jī)組成原理(第2版)[M].北京:高等教育出版社,2011.
[3] 朱亞超.基于IEEE754的浮點(diǎn)數(shù)存儲(chǔ)格式分析研究[J].計(jì)算與信息技術(shù),2010,8(10):1207-1280.
[4] IEEE Standard for Binary Floating-Point Arithmetic.ANSI/IEEE Standard 754-1985.Institute of Electrical and Electronics Engineers,August 1985.
[5] 田祎,樊景博.計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言類(lèi)課程整合教學(xué)探討[J].商洛學(xué)院學(xué)報(bào),2012,4(26):28-30.
[6] 田祎.項(xiàng)目教學(xué)法在計(jì)算機(jī)語(yǔ)言實(shí)驗(yàn)教學(xué)中的應(yīng)用[J].商洛學(xué)院學(xué)報(bào),2010,5(24):91-93.
作者簡(jiǎn)介:
田 祎(1983-),男,碩士,講師.研究領(lǐng)域:計(jì)算機(jī)應(yīng)用技術(shù).
樊景博(1966-),男,本科,教授.研究領(lǐng)域:數(shù)據(jù)庫(kù).