MATLAB中數(shù)值型數(shù)據(jù)的機(jī)內(nèi)編碼與存貯空間浪費(fèi)
井敏英
(陜西理工學(xué)院 物理與電信工程學(xué)院, 陜西 漢中 723000)
[摘要]MATLAB中的數(shù)值型數(shù)據(jù)分為整數(shù)型和浮點(diǎn)型,整數(shù)型數(shù)據(jù)以二進(jìn)制補(bǔ)碼存儲(chǔ),浮點(diǎn)型數(shù)據(jù)存儲(chǔ)復(fù)雜。針對(duì)此情況,在MATLAB 2012a環(huán)境中,對(duì)浮點(diǎn)型單精度實(shí)數(shù)和雙精度實(shí)數(shù)的機(jī)內(nèi)編碼方案進(jìn)行實(shí)驗(yàn)研究,結(jié)果表明浮點(diǎn)型數(shù)據(jù)表示為規(guī)范形式,存儲(chǔ)其中的數(shù)符碼、指數(shù)碼和尾數(shù)編碼。根據(jù)實(shí)數(shù)絕對(duì)值大小范圍的不同,尾數(shù)有兩種不同的機(jī)內(nèi)編碼方案:“大實(shí)數(shù)”尾碼和“小實(shí)數(shù)”尾碼。MATLAB浮點(diǎn)型數(shù)據(jù)的機(jī)內(nèi)編碼一方面對(duì)所表示數(shù)的范圍做了擴(kuò)充,另一方面實(shí)數(shù)編碼方案存在大量存貯空間閑置。為充分利用存儲(chǔ)資源,MATLAB軟件有必要進(jìn)一步優(yōu)化。
[關(guān)鍵詞]MATLAB; 浮點(diǎn)型數(shù)據(jù); 機(jī)內(nèi)編碼;存貯空間浪費(fèi)
[文章編號(hào)]1673-2944(2015)05-0045-05
[中圖分類號(hào)]TP311
收稿日期:2015-03-05
作者簡(jiǎn)介:井敏英(1978—),女,陜西省富平縣人,陜西理工學(xué)院講師,碩士,主要研究方向?yàn)樾盘?hào)處理。
MATLAB是全世界最流行、應(yīng)用最廣泛的科學(xué)與工程計(jì)算軟件之一[1],在工程領(lǐng)域有廣泛應(yīng)用[2-4],與其它軟件也有很好的結(jié)合性[5-7],但對(duì)MATLAB中實(shí)數(shù)的機(jī)內(nèi)編碼研究較少。王正林等[8]給出的MATLAB數(shù)值型數(shù)據(jù)的表示范圍是不準(zhǔn)確的,并且未涉及數(shù)據(jù)的機(jī)內(nèi)編碼方案。龍姝明、陳愛民等[9-10]雖然準(zhǔn)確討論了實(shí)數(shù)的機(jī)內(nèi)編碼、表數(shù)范圍及有效位數(shù)等實(shí)數(shù)編碼相關(guān)問題,但僅僅是C語言的實(shí)數(shù)編碼方案,并且未指出編碼方案存在存貯空間浪費(fèi)現(xiàn)象。實(shí)驗(yàn)表明,MATLAB浮點(diǎn)數(shù)編碼方案有一部分與C語言一致,也有為了擴(kuò)大表數(shù)范圍而做出的擴(kuò)展,擴(kuò)展部分與C語言實(shí)數(shù)編碼方案不同,MATLAB浮點(diǎn)數(shù)編碼方案擴(kuò)展未見文獻(xiàn)報(bào)道。本文以MATLAB軟件2012a為基礎(chǔ),對(duì)單精度實(shí)數(shù)和雙精度實(shí)數(shù)的機(jī)內(nèi)編碼形式進(jìn)行了實(shí)驗(yàn)研究,給出MATLAB的實(shí)數(shù)編碼方案的全部及其表數(shù)范圍和量化階,并指出MATLAB實(shí)數(shù)編碼方案存在的存貯空間浪費(fèi)現(xiàn)象。
1單精度實(shí)數(shù)的機(jī)內(nèi)編碼方案與空間浪費(fèi)
MATLAB中single表示單精度實(shí)數(shù),每個(gè)數(shù)據(jù)占4 B空間,即32 bit,按絕對(duì)值大小不同分別有兩種編碼方案。絕對(duì)值范圍為[2-126,2127(2-2-23)],并且量化階為2-23=1.192 1×10-7的數(shù)稱為大單精度實(shí)數(shù)(singlebig),MATLAB對(duì)這類數(shù)的編碼方案與C語言編碼方案完全一致,這類編碼方案表示的十進(jìn)制數(shù)絕對(duì)值范圍為1.175 5×10-38~3.402 8×1038,現(xiàn)行文獻(xiàn)[8]給出的單精度實(shí)數(shù)編碼方案中的表數(shù)范圍實(shí)際是大單精度實(shí)數(shù)的表數(shù)范圍,對(duì)應(yīng)尾碼方案中的h=1。
MATLAB中絕對(duì)值范圍為[0,2-126-2-149],并且量化階為2-149=1.403×10-45的數(shù)稱為小單精度實(shí)數(shù)(singlesmall),相應(yīng)編碼方案中尾碼方案中的h=0。這類實(shí)數(shù)的編碼方案是全新的,而且是MATLAB特有的,沒有C語言對(duì)應(yīng),到目前為止沒有文獻(xiàn)報(bào)道。
在MATLAB中實(shí)數(shù)可以規(guī)范為
(1)
機(jī)內(nèi)編碼方案為SET,其中,S為數(shù)符碼,E=p+127為指數(shù)碼,h+T為尾碼。S=0(表示正實(shí)數(shù))或1(表示負(fù)實(shí)數(shù))。
絕對(duì)值范圍為[2-126,2127(2-2-23)]的實(shí)數(shù)稱為大單精度實(shí)數(shù)(singlebig),h=1,指數(shù)碼中p的取值范圍為-126≤p≤127,指數(shù)碼取值范圍為1≤E≤254,尾數(shù)碼中T的取值范圍為0≤T≤1-2-23。存儲(chǔ)時(shí)在4 B空間中S、E、T分別占用1、8、23個(gè)bit,h=1默認(rèn)不用存儲(chǔ),其存儲(chǔ)格式為:
S8 bitEcode23 bitTcode
按照編碼方案SET,絕對(duì)值最小的非0實(shí)數(shù)是2-126=1.175 5×10-38,編碼方案中的E=1=(0000 0001)2=01(H),T=0,S=0或1,這個(gè)數(shù)的十六進(jìn)制碼為0080 0000(H)(2-126)或8080 0000(H)(-2-126)。絕對(duì)值最大的實(shí)數(shù)是2127(1+1-2-23)=3.402 8×1038,編碼方案SET中的E=254=(1111 1110)2,T=1-2-23=(111 1111 1111 1111 1111 1111)2,S=0或1,這個(gè)數(shù)的十六進(jìn)制機(jī)內(nèi)碼為7f7f ffff(H)(正數(shù))或ff7f ffff(H)(負(fù)數(shù))。在MATLAB軟件命令窗口中,輸入realmin(′single′)運(yùn)行給出1.175 5×10-38,輸入realmax(′single′)運(yùn)行給出3.402 8×1038,其中realmin和realmax為MATLAB內(nèi)部函數(shù)。輸入
format hex;x=single([2^-126,-2^-126])
y=single([2^127*(2-2^-23),-2^127*(2-2^-23)])
運(yùn)行后給出絕對(duì)值最小、最大的“大單精度實(shí)數(shù)”的十六進(jìn)制機(jī)內(nèi)編碼。
實(shí)驗(yàn)發(fā)現(xiàn),在MATLAB的大單精度實(shí)數(shù)編碼方案SET中,S=0,T=0,p=128,E=p+127=255的編碼表示正無窮大Inf,它的32 bit二進(jìn)制機(jī)內(nèi)碼7f80 0000(H)對(duì)應(yīng)2128:
01111 11110000 0000 0000 0000 0000 000
S=1,T=0,p=128,E=p+127=255的編碼表示負(fù)無窮大-Inf,32 bit二進(jìn)制機(jī)內(nèi)碼ff80 0000(H)對(duì)應(yīng)-2128:
11111 11110000 0000 0000 0000 0000 000
非數(shù)符號(hào)NaN的機(jī)內(nèi)編碼ffc0 0000(H)對(duì)應(yīng)(-1)12128(1+2-1),即S=1,p=128,E=p+127=255,T=2-1:
11111 11111000 0000 0000 0000 0000 000
但卻不能用single((-1)*2^128*(1+2^-1))命令輸入NaN;“大單精度實(shí)數(shù)”編碼方案中,數(shù)的量化階為2-126×2-23=2-149=1.401 298 5×10-45≈0.000 000 1×10-38;大單精度實(shí)數(shù)只有23位尾數(shù),所以對(duì)應(yīng)十進(jìn)制數(shù)的有效位數(shù)為lg 223=6.923 689 9≈7位。
編碼實(shí)例,實(shí)數(shù)x=-128.5=(-1)127(1+2-8),按照式(1)的編碼方案,S=1,E=7+127=134,T=2-8,它的編碼為xSET=(1 1000 0110 0000 0001 0000 0000 0000 000)2=c300 8000(H)。為了驗(yàn)證編碼的正確性,在MATLAB軟件命令窗口中輸入命令
format hex;x=single(-128.5)
運(yùn)行后得到xSET=c300 8000(H),實(shí)驗(yàn)驗(yàn)證了結(jié)果的正確性。
在“大單精度實(shí)數(shù)”編碼方案SET中,絕對(duì)值大于2127(2-2-23)的數(shù)均視為無窮大,絕對(duì)值小于2-126的所有實(shí)數(shù)均視為0。為了擴(kuò)展實(shí)數(shù)在區(qū)間[0,2-126)上的表數(shù)精度,MATLAB增加了“小單精度實(shí)數(shù)”編碼方案。
絕對(duì)值范圍在[0,2-126-2-149]內(nèi)的實(shí)數(shù)稱為小單精度實(shí)數(shù)(singlesmall),編碼方案還是SET,與大單精度實(shí)數(shù)編碼方案不同的是h=0。其中,E=p+126=0固定不變,尾數(shù)T取值范圍為:0≤T<1-2-23。由于2-126-2-149=2-127(2-2-22),所以對(duì)應(yīng)p=-127,E=p+127=0對(duì)應(yīng)的8bit指數(shù)碼為0。特別h=0不需要存貯。存儲(chǔ)格式為:
S0000 000023bitTcode
按照式(1)的編碼方案,實(shí)數(shù)x=2-127=2-1262-1,32位二進(jìn)制機(jī)內(nèi)編碼為xSET=(0 0000 0000 1000 0000 0000 0000 0000 000)2=0040 0000(H),與實(shí)驗(yàn)結(jié)果相同。
在MATLAB軟件中,由于對(duì)實(shí)數(shù)編碼方案做了擴(kuò)展,所以小于2-126的單精度實(shí)數(shù),編碼并不為0。例如8bit指數(shù)碼全0的機(jī)器碼0000 0001(H)=2-1262-23=2-149=1.401 3×10-45。絕對(duì)值小于等于2-1262-24的實(shí)數(shù),機(jī)內(nèi)編碼為0000 0000(H)。單精度實(shí)數(shù)的量化階為1.401 3×10-45=2-149。小單精度實(shí)數(shù)表示數(shù)的絕對(duì)值范圍為0~1.175 5×10-38(即0~2-126-2-149)。
總之MATLAB單精度實(shí)數(shù)編碼方案擴(kuò)充之后,能表示的實(shí)數(shù)絕對(duì)值在[0,2127(2-2-23)]范圍內(nèi),數(shù)的量化階為2-149=1.401 3×10-45。
單精度實(shí)數(shù)(single)的8位指數(shù)碼全1時(shí),數(shù)符碼和尾碼有224個(gè)狀態(tài)不能用來表示數(shù),其中有兩種狀態(tài)分別表示Inf和-Inf,另有一種狀態(tài)表示NaN,所以單精度實(shí)數(shù)編碼方案SET共有232-(224-3)=4 278 190 083個(gè)表數(shù)狀態(tài),其中224-3=16 777 213個(gè)表數(shù)狀態(tài)無法有效利用,或者說MATLAB的單精度實(shí)數(shù)編碼方案造成了224個(gè)狀態(tài)只能用來表示3個(gè)數(shù),即Inf、-Inf、NaN??梢奙ATLAB實(shí)數(shù)編碼方案相對(duì)C語言有“小實(shí)數(shù)”的擴(kuò)展,但仍然造成實(shí)數(shù)存貯空間有16 777 213個(gè)表數(shù)狀態(tài)無法有效利用的大量空間浪費(fèi)現(xiàn)象。
2雙精度實(shí)數(shù)(double)的機(jī)內(nèi)編碼方案與存貯空間浪費(fèi)
doublebig表示大雙精度實(shí)數(shù),每個(gè)數(shù)據(jù)占8B空間,表數(shù)的絕對(duì)值范圍為[2-1 022,21 023(2-2-52)],即[2.225 1×10-308~1.797 7×10308],相應(yīng)編碼方案仍然為SET。其中E=p+1 023,-1 022≤p≤1 023,1≤E≤2 046,h=1,0≤T≤1-2-52。S、E、T分別占用1、11、52個(gè)bit,h=1不用存貯。其存儲(chǔ)格式為:
S11bitp+1 02352bitTcode
MATLAB中,realmin(′double′)給出2.225 073 858 507 201×10-308,realmax(′double′)給出1.797 693 134 862 316×10308,eps=2-52=2.220 446 049 250 313×10-16。
按照式(1)編碼方案,實(shí)數(shù)x=128.75=(-1)027(1+2-8+2-9),E=7+1 023=1 030,S=0,T=2-8+2-9,它的機(jī)內(nèi)編碼為xSET=(0100 0000 0110 0000 0001 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000)2=4060 1800 0000 0000(H),與formathex;x=128.75運(yùn)行后給出的實(shí)驗(yàn)結(jié)果相同。
實(shí)驗(yàn)發(fā)現(xiàn),在MATLAB的大雙精度實(shí)數(shù)編碼方案SET中,S=0,T=0,p=1 024,E=p+1 023=2 047的編碼表示正無窮大Inf,它的64bit二進(jìn)制機(jī)內(nèi)碼8ff0 0000 0000 0000(H)對(duì)應(yīng)21 024:
0 1111 1111 1110000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
S=1,T=0,p=1 024,E=p+1 023=2 047的編碼表示負(fù)無窮大-Inf,64位二進(jìn)制機(jī)內(nèi)碼fff0 0000 0000 0000(H)對(duì)應(yīng)-21 024:
11111 1111 1110000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
非數(shù)符號(hào)NaN的機(jī)內(nèi)編碼fff8 0000 0000 0000(H)對(duì)應(yīng)(-1)121 024(1+2-1),即S=1,p=1 024,E=p+1 023=2 047,T=2-1:
11111 1111 1111000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
但卻不能用double((-1)*2^1024*(1+2^-1))命令輸入NaN;“大雙精度實(shí)數(shù)”編碼方案中,數(shù)的量化階為2-1 022×2-52=2-1 074=4.940 656 458 412 465×10-324;大雙精度實(shí)數(shù)有52位尾數(shù),所以對(duì)應(yīng)十進(jìn)制數(shù)的有效位數(shù)為lg252=15.653 56≈16位。
在MATLAB大雙精度實(shí)數(shù)的編碼方案SET中,絕對(duì)值超過21 023(2-2-52)的實(shí)數(shù)視為無窮大,但絕對(duì)值小于2-1 022=2.225 1×10-308的實(shí)數(shù)并不等于0,這說明MATLAB對(duì)雙精度實(shí)數(shù)的編碼方案SET做了擴(kuò)展,也就是說,在MATLAB中存在“小雙精度實(shí)數(shù)”。
小雙精度實(shí)數(shù)(doublesmall)表示數(shù)的絕對(duì)值范圍為[0,2-1 022-2-1 074],編碼方案還是SET,與大雙精度實(shí)數(shù)編碼方案不同的是h=0。因?yàn)?-1 022-2-1 074=2-1 022(1-2-52)=2-1023(2-2-51),所以p=-1 023,于是E=p+1 023=0固定不變,0≤T≤1-2-52,存貯S、E=0和T對(duì)應(yīng)的機(jī)器碼的編碼格式為:
S0000 0000 00052bitTcode
實(shí)數(shù)的絕對(duì)值小于等于2-1 023(2-2-51)后,編碼方案按式(1)進(jìn)行,p=-1 023固定不變,即指數(shù)碼11位二進(jìn)制位全為0,而且0≤T<1。
例如2-1 022>2-1 023(2-2-51),所以是按大雙精度實(shí)數(shù)編碼,機(jī)器碼是2-1 022(1+T)=0010 0000 0000 0000(H),其中T=0。又例如,2-1 023<2-1 023(2-2-51),按小雙精度實(shí)數(shù)編碼,2-1 023=2-1 0222-1的機(jī)器碼是0008 0000 0000 0000(H),注意其中指數(shù)碼為0。實(shí)數(shù)2-1 0222-53的編碼為0000 0000 0000 0000(H)。實(shí)數(shù)2-1 0222-52=4.940 7×10-324編碼為0000 0000 0000 0001(H)??梢姡p精度實(shí)數(shù)的量化階為2-1 074=4.940 656 458 412 465×10-324。小雙精度實(shí)數(shù)表示數(shù)的絕對(duì)值范圍為0~2.225 073 858 507 201×10-308(即0~2-1 022-2-1 074)。
雙精度實(shí)數(shù)(double)的11位指數(shù)碼全為1時(shí),數(shù)符碼和尾碼共有253種狀態(tài)不能有效地表示數(shù),其中有兩種狀態(tài)分別表示Inf和-Inf,另有一種狀態(tài)表示NaN,所以雙精度實(shí)數(shù)共有264-(253-3)=18 437 736 874 454 810 624個(gè)有效的表數(shù)狀態(tài),存在253-3=9 007 199 254 740 989個(gè)狀態(tài)不能表示實(shí)數(shù),或者說MATLAB的雙精度實(shí)數(shù)編碼方案造成了253個(gè)存數(shù)狀態(tài)只能用來表示3個(gè)數(shù),即Inf、-Inf、NaN,編碼方案造成了大量的存貯空間浪費(fèi)。
3MATLAB與C語言實(shí)數(shù)機(jī)內(nèi)碼編碼方案比較
在C語言中,將實(shí)數(shù)規(guī)范為
(2)
單精度和雙精度實(shí)數(shù)采用的編碼方案均為SET,而長(zhǎng)雙精度則采用SE1T編碼方案[9]。
在MATLAB中,實(shí)數(shù)規(guī)范為
(3)
編碼方案均用SET,但對(duì)大實(shí)數(shù)h=1,小實(shí)數(shù)h=0。于是兩種方案表示的實(shí)數(shù)精度和范圍各不相同。其異同見表1。
表1 實(shí)數(shù)的 C語言編碼方案與 MATLAB編碼方案比較
由表1可見,實(shí)數(shù)的C語言編碼和MATLAB編碼都存在存儲(chǔ)空間浪費(fèi)現(xiàn)象。C語言實(shí)數(shù)編碼中無正負(fù)無窮和非數(shù)概念,但是有上溢出和下溢出現(xiàn)象。MATLAB的實(shí)數(shù)編碼方案中有正負(fù)無窮和非數(shù)3個(gè)狀態(tài)的編碼,但無溢出現(xiàn)象,更重要的是MATLAB編碼擴(kuò)展了機(jī)內(nèi)單、雙精度實(shí)數(shù)的表數(shù)范圍,大幅度減小了實(shí)數(shù)量化階。相比之下MATLAB的實(shí)數(shù)編碼方案優(yōu)于C語言的實(shí)數(shù)編碼方案。
4結(jié)語
MATLAB為了提高實(shí)數(shù)編碼的表數(shù)精度和表數(shù)范圍,對(duì)編碼方案做了擴(kuò)展,加入“小實(shí)數(shù)概念”:singlesmall和doublesmall,結(jié)果大幅度減小了實(shí)數(shù)機(jī)內(nèi)存貯表示的量化階,單精度實(shí)數(shù)的機(jī)內(nèi)表示量化階為2-149=1.401 298 5×10-45,雙精度實(shí)數(shù)的機(jī)內(nèi)表示量化階為2-1 074=4.940 656 458 412 465×10-324,相對(duì)C語言的實(shí)數(shù)編碼方案,MATLAB實(shí)數(shù)機(jī)內(nèi)表示的精度明顯提高,表數(shù)范圍在接近0的空間上有明顯的擴(kuò)展。但是MATLAB實(shí)數(shù)機(jī)內(nèi)編碼方案仍然沒有解決實(shí)數(shù)存貯空間的大量無效表數(shù)狀態(tài)造成的空間浪費(fèi)的問題。
建議MATLAB研發(fā)團(tuán)隊(duì)將來能夠通過重新選擇正負(fù)無窮和非數(shù)的機(jī)內(nèi)編碼來解決這一問題。如果將單精度或雙精度實(shí)數(shù)的8位或11位指數(shù)碼全置1,然后利用23位或52位尾碼寫入有用信息,則可以達(dá)到在MATLAB環(huán)境中加密信息的特殊效果,因?yàn)檫@時(shí)MATLAB看到的這組信息僅僅是正負(fù)無窮和非數(shù)符號(hào)組成的密文信息。
[參考文獻(xiàn)]
[1]鄭阿奇,曹弋.MATLAB實(shí)用教材[M].北京:電子工業(yè)出版社,2011:1-30.
[2]ZHENDai.MATLABsoftwareforGPScycle-slipprocessing[J].GPSSolutions,2012,16(2):267-272.
[3]MARKIEWICZT.UsingMATLABsoftwarewithTomcatserverandJavaplatformforremoteimageanalysisinpathology[J].DiagnPathol,2011,6(s1):18.
[4]PEREAA,CASTELLANOJ,ALDAYL,etal.AnalysisofbehaviourinsportsthroughpolarcoordinateanalysiswithMATLAB[J].Quality&Quantity,2012,46(4):1249-1260.
[5]王海崗,張坤宇,張雁佳,等.VC與MATLAB混合編程在圖像處理中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2012,29(1):273-275.
[6]馬培勇,羅紅潤(rùn),周思柱.基于COM組件的MATLAB和VB混編方法在機(jī)械可靠性工程中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2012,29(7):189-191.
[7]宋廣東,王昌,王金玉,等. 基于DLL技術(shù)和COM組件技術(shù)實(shí)現(xiàn)LabVIEW和MATLAB混合編程[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(1):287-289.
[8]王正林,劉明.精通MATLAB7[M].北京:電子工業(yè)出版社,2006:62-67.
[9]龍姝明.實(shí)數(shù)機(jī)內(nèi)碼的實(shí)驗(yàn)研究[J].漢中師范學(xué)院學(xué)報(bào),2000,18(3):86-91.
[10]陳愛民,毛莉珍.TurboC中兩個(gè)浮點(diǎn)數(shù)問題分析[J].寧德師范學(xué)院學(xué)報(bào):自然科學(xué)版,2013,25(4):371-372.
[責(zé)任編輯:謝 平]
InternalcodeofcomputerinMATLABandwasteofstoragespace
JINGMin-ying
(SchoolofPhysicsandTelecommunicationEngineering,ShaanxiUniversityofTechnology,
Hanzhong723000,China)
Abstract:Numeric data in MATLAB is divided into integral and Floating-point type, and integral type is stored in binary complement, but floating-Point data storage is very complicated. For this situation, in the MATLAB 2012a version, a simulated experiment was conducted to in terms of the single precision real number and double precision real number coding scheme within the machine. The experimental results showed that floating-point number is specified for standard form, and this form consisted of the storage of number sign code, index number and mantissa code. According to differences in size range of absolute value of real numbers, mantissa code has two coding scheme, and they are “big real number” and “small real number”. The results found that on the one hand the range of machine number is expanded in MATLAB floating-point data coding scheme. On the other hand, coding scheme allows for plenty of idle storage space. To make full use of storage resources, it is necessary to further optimize the MATLAB software.
Keywords:MATLAB;floating-pointnumber;internalcodeofcomputer;wasteofstoragespace