












摘要:浮點型數據在計算機系統中廣泛應用,但其表示精度存在一定的限制,客觀存在不能精確表示的現象。在教學工作中,關于IEEE754規格化浮點數有效位數的內容難以理解,導致學生對浮點數精度的學習存在困難。基于IEEE754標準,通過大量圖表、實例,將浮點數的基本格式、數據范圍、精度等問題具象闡釋。對精度問題提出了兩種理解方式:一是從數值分析的角度根據有效數字的嚴格定義來進行確定;二是從近似值能準確表示的十進制數的位數來確定。開發了一個可視化的教學輔助工具,能夠直觀展示浮點數的精度判斷結果,對于教學工作具有實際應用價值。
關鍵詞:浮點數;IEEE754;有效位數;取值范圍;計算機系統
中圖分類號:TP301 文獻標識碼:A
文章編號:1009-3044(2024)17-0168-04 開放科學(資源服務)標識碼(OSID) :
0 引言
自教育部在2017年提出開展新工科建設后,隨著新工科專業建設的不斷深入,復雜應用型人才的培養成為高校人才培養的方向。高校計算機科學與技術專業教指委對計算機專業學生的培養提出了專業能力培養目標,特別強調計算機系統能力培養的重要性[1-2]。2021年12月31日,教育部啟動了一個旨在改進計算機專業課程教學的“101計劃”[3]。計算機專業人才的能力培養最終體現在專業教學中的課程內容和課堂教學過程。計算機系統基礎是計算機專業的基礎課程,是“ 101計劃”12門核心課程之一。
作為“101計劃”教材試點項目單位,浙大城市學院計算機系統基礎課程注重課堂教學細節的打磨,力求將培養學生的系統思維能力落實到具體的知識點。計算機系統基礎教學過程中,高級語言中的浮點數在機器底層的表示是教學重點和難點。浮點型數據在編程使用中存在不能精確表示實數的現象,并且關于IEEE754標準中規格化浮點數有效位數內容的教學深度難以把握,導致學生對浮點數精度的理解有一定困難。本文通過對IEEE754標準的基本介紹,對規格化浮點數范圍和精度的深度分析,并開發一個可視化的應用程序顯示輸入數據的有效位數,具體具象地幫助學生更好地理解IEEE754標準中的規格化浮點數,從而引導學生在編程中有意識地避免因精度問題導致科學計算的錯誤。
1 IEEE754標準簡介
IEEE754標準具有兩種基本浮點格式:32位單精度float格式和64位雙精度double格式。
如圖1所示,這兩種類型數據在存儲中都由兩個定點數和一個符號位來存儲表示[4]。
1) 符號位 S:float 類型和 double 類型都占 1 位,將正負號進行符號數字化,0 代表正,1 代表負。
2) 指數位 E: float 類型占 8 位,double 類型占 11 位,指數采用移碼表示,即將原來的實際指數值加上一個偏移量固定值,該固定值為 B= 2e - 1 - 1(B表示偏移量,e表示指數部分比特長度,對于 float 類型,e=8,偏移量 B= 127;對于 double 類型,e=11,B=1023) 。
3) 尾數位M:float類型占23位,double 類型占52 位。尾數采用定點小數原碼表示,對于規格化后的尾數,首位默認位1,并缺省隱藏,使得對于float類型,只保存23位尾數便可用來表示 24 個有效信息,對于double 類型,52位尾數部分可以表示53 個有效信息。
2 浮點數的范圍
2.1 規格化浮點數的范圍
首先討論規格化浮點數在一個數軸上的分布情況。float類型的階碼部分存儲的是一個無符號整數,取值范圍為00000000~11111111,即[0,255],則實際指數取值范圍為[-127,128]。而規格化浮點數,階碼范圍去掉了全0 和全1 的情況,即00000001~11111110,實際指數取值范圍為[-126,127]。
對于其中任意一個階,其23位尾數,從1.0...0 ~ 12.-112.6.。.1因將此一,個 以階[2均-12勻6,2分-125成]范了圍2內23段的,規每格一化段浮間點距數為為2例-23×,其在數軸上的分布如圖2所示:
對于下一段,每一小段的間距為2-23×2-125,是前面一段的2倍。因此,規格化浮點數在數軸上的分布如圖3所示,每一個階的區間內等距分布223個數,下一區間是上一區間相鄰數間隔的2倍,分布越來越稀疏。
由此可以得出規格化浮點數的范圍[5]:float類型能表示的絕對值最小數為1×2-126,對應十進制數約為 1.1754943508222875×10-38,最大數為1.M×2127,M為全1,對應十進制數約為3.40282×1038 ;而double類型則同理,能表示的規格化絕對值最小數為 1×2-1022,對應十進制數約為 2.2250738585072012×10-308,規格化絕對值最大數為1.M×21023,M 為全1,對應十進制數約 為1.7976931348623157×10308。
2.2 非規格化浮點數的范圍
非規格化浮點數在數軸上的分布如圖4所示,通過在-2-126~0和0 ~2-126這兩段區間內,都均勻地插入223個數,用來表示比最小規格化數還要小的數。
當遇到不能用規格化數表示的極小的浮點數時,采用“逐級下溢”的操作,尾數的首位隱藏位不再是1而是0,將階統一為2-126,再根據舍入方式來近似表示。
由此可以得出非規格化浮點數的范圍[5]:float類型能表示的非零絕對值最小數為0.M×2-126,尾數部分1M.40最129后846一432位481為71 ×11,0-對45,非應零十絕對進值制最大數數約為為0. M×2-126,M為全1,對應十進制數約為1.175494×10-38;而double類型則同理,能表示的非規格化非零絕對值最小數為0.M×2-1022,尾數部分M最后一位為1,對應十進制數約為4.9406564584124654×10-324,非零絕對值最大數為0.M×2-308,M 為全1,對應十進制數約為2.2250738585072009×10-308。
3 浮點數的精度
3.1 IEEE754表示浮點數的方式
根據上文對IEEE754標準中浮點數分布的分析,可以看到IEEE754標準就是將實數分割成一個一個的“離散”的值在內存中存儲,使得計算機能夠盡可能地在無限的實數中表示出更多的浮點數。
通常,當我們給出某一高精度浮點數時,很可能不是IEEE754 標準下能夠恰好表示出來的那個數。因此,在規定的舍入規則下,該數會被舍入到鄰近某一精確的可表示數來存儲。
如圖5所示,為了更直觀地計算,在此給出整理后的部分32位浮點數的間隔表。表中Min、Max、Gap三列,反映的即為區間[Min,Max]上的GAP值,也就是在數軸上每個區間內等間隔相鄰數的間距。
例如,當需要表示16777217 時,結果將被舍成16777216,如圖 6所示。因為在區間[16777216,33554430]上的GAP值為2,IEEE754只能表示16777216和16777218,16777217就是圖4表示的數軸上沒有刻度的一個位置。
驗證更多數據,發現均是如此,如圖7所示。
了解了IEEE754最底層的存儲方式后,那么此時便存在著“真值”“近似值”的概念。那些輸入的不能被恰好精確表示的即為“真值”,內存中存儲的則是“ 近似值”。進而便存在近似值的精度問題,即IEEE754舍入后表示的數相比于給定的浮點數接近程度的討論。
3.2 浮點數精度分析
3.2.1 相關概念及術語
真值A:一個真實準確的數值。
近似值A*:接近真值的一個值。
精度:觀測值與真值的接近程度。
有效數字:反映近似值準確程度的概念。當近似值的絕對誤差限是其某一位上的半個單位時,就稱其“準確”到這一位,且從該位起直到前面第一位非零數字為止的所有數字都稱為有效數字。
有效位數:有效數字的個數。假設A是真值,A*是近似值。A = ±0.a1a2...an...×10m,其中m是整數,a1到a1n0都-k,即是A0到的9誤中差的不某超個過數10字-k,的a1半 !=個 0單.如位果,|則A-稱A*近| ≤似0.5數×A*準確到10-k 位,并說A*有m+k位有效位數。
絕對誤差η:η=|A - A*|。
絕對誤差限:η絕對值的一個上限,即如果存在一個正數e,使得|η|≤e,那么稱e為A*的絕對誤差限。
相對誤差:絕對誤差與被測量真值之比。
相對誤差限:相對誤差的上限。
3.2.2 兩種理解方式
一種理解的描述是32位浮點數的精度是6~8位十進制有效數字,64位浮點數的精度是15~17位十進制有效數字。
另一種理解的描述是32位浮點數的精度是6~8 位十進制數,64 位浮點數的精度是15~17 位十進制數。
兩個結論看似一樣,但對于float、double精度的討論,從不同的角度看,兩種理解方式皆有其合理性。
1) float 的精度是6~8 位十進制有效數字。給定真值π 和其近似值3.1416。若求近似值的有效位數,則根據有效數字的定義,|π-3.1416|≤0.5×10-4,即近似值的絕對誤差限是小數點后第四位上的半個單位,近似值準確到該位,并且從該位起直到前面第一位非零數字為止的所有數字都稱為有效數字,故3.1416的有效位數為5位。這種方法即嚴格意義上的有效位數計算方式,也就是第一種結論的分析方式。
2) float 的精度是6~8 位十進制數。對于同樣的例子,如果對近似值精度的理解是近似值從左到右正確表示了多少位的十進制數,那么只需從左到右對3.1416 和3.1415926 依次逐位比較,發現精確到了0.001,即可得出近似值正確表示了4位十進制數。
此時,相較于第一種判斷精度的方式,這種方式似乎給人一種不準確的感覺,因為其并沒有引入“有效位數”的概念。但筆者認為只要厘清定義,兩種方式都可以用來分析精度。
3) 比較與總結。第一種理解的判準,引入了“有效位數”的概念,是從嚴格的數值分析[6]角度來確定近似值具有多少個有效數字的;第二種理解的判準沒有引入“有效位數”的概念,而是用近似值從左到右準確表示了多少個真值中的十進制數來表示精度。我們要確定精度,就是要確定近似值和真值的接近程度,那么這種方式在一定程度上的確是能夠描繪出這一概念的。
值得注意的一點是,根據第一種判斷方式,有n 位有效數字的近似值A*是真值A的準確到第n 位的近似值,那么只有以下兩種情形:A*的這n 位數字與A中的n 位數字完全相同;A*的前n-1位數字與A中的n-1位數字完全相同,只有第n 位數字不同,并且不同時,兩者相差1。由此可以發現,實際上用近似值從左到右正確表示了多少位的十進制數的方式來表示精度,就是第一種判斷方式的子集。因為采用十進制數判準方法獲得的有效位數,用數值分析的方式一定也能判斷出來。
并且,結合實際調查詢問,許多學生在一開始查看float或double的精度時,就是通過輸入一系列值,簡單地比對有多少十進制位相同,來依次確認6~8位“有效位數”的結論。也就是說,這種判準在某種意義上是更為常用的判斷方式,更簡單便捷,易于學生理解。但要分清楚基本概念,在這種方式的使用場景下,并不能用“有效位數”來描述衡量。
3.3 具體數據實例說明
下面通過實際數據樣例,具象直觀地查看float類型精度為何是6~8位有效數字。
按照有效數字的嚴格定義,2048.0001~2048.0008的有效位數如圖8所示:
4532.50~4532.85的有效位數如圖9所示:
由此可以大致看出,輸入一定高精度的浮點數,float的精度是6~8位十進制有效數字。而上述只是部分數據的簡單反映,要想嚴格證明有效位數,還需要數學層面的嚴格證明。同樣,按第二種處理方式,2048.0001~2048.0008的精度如圖10所示:
注意,圖10的第7、9、15行即與第一種處理方式結論“不同”(有效位數為x位,而精確到y位十進制數)的情形。
綜上,在第二種理解方式下,通過簡單的數據羅列能看出,輸入一定高精度的浮點數,float的精度能精確到6~8位十進制數。
4 教學輔助工具
通過如上分析可以發現,想要在教學過程中直觀清晰地闡明浮點數的精度問題屬實不易,學生在學習過程中也極易因精度理解的不同產生疑惑[7]。故開發一個可視化程序,實現浮點數的精度判斷,輔助學生進行學習。
學生可以輸入任意數值,選擇float 類型或者double類型,程序將給出機器數以及兩種角度下判斷的精度。
源數字:即輸入的值,真值。
機器內轉換后的數字:即真實存儲在機器中的值。
精確到了幾位十進制數: 從左邊第一個數開始比較,直到第一個與真值不同的數字結束,中間所有數字即有效數字。如圖12運行結果二,從第一個數字0 到數字6,存在11位相同的十進制數。
嚴格意義下的有效數字:即按照前文所述的有效位數的嚴格定義,即7位有效數字。
5 總結
在計算機系統工作原理的教學中,高級語言中的浮點數在機器底層的表示是重要的教學內容。浮點數的表示范圍和精度,是其理解的難點和重點。本文對IEEE754標準中的浮點數表示范圍和精度進行了詳細的分析,為了能夠在教學過程中讓學生對這個問題理解得更透徹,并沒有進行非常嚴格的數學角度的推理,而是從圖形和程序展示的角度,讓學生能夠有直觀感受,從而能夠更好地理解浮點數在機器底層表示的原理和局限性,為日后工程開發中合理正確地使用浮點數奠定基礎,避免在最終計算結果中產生重大錯誤。
【通聯編輯:王力】
基金項目:2023年度計算機領域本科教育教學改革試點工作計劃“( 101計劃”) 教材試點應用項目;國家級大學生創新創業訓練計劃項RoadSense-基于路面坑洼檢測的智慧交通決策支持系統(202313021005) ;2021 年度教育部第二批產學合作協同育人項目“面向系統能力培養的計算機系統原理在線教學資源建設”(202102533017) ;2023 年校級在線開放課程建設項目“計算機系統原理實驗”;2023 年校級七期重點教材建設項目“計算機系統原理實驗”;2022 年校級本科實踐教學改革研究項目“逆向工程綜合實驗”(SJ2201)