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