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