MATLAB中数值型数据的机内编码与存贮空间浪费
2016-01-08井敏英
MATLAB中数值型数据的机内编码与存贮空间浪费
井敏英
(陕西理工学院 物理与电信工程学院, 陕西 汉中 723000)
[摘要]MATLAB中的数值型数据分为整数型和浮点型,整数型数据以二进制补码存储,浮点型数据存储复杂。针对此情况,在MATLAB 2012a环境中,对浮点型单精度实数和双精度实数的机内编码方案进行实验研究,结果表明浮点型数据表示为规范形式,存储其中的数符码、指数码和尾数编码。根据实数绝对值大小范围的不同,尾数有两种不同的机内编码方案:“大实数”尾码和“小实数”尾码。MATLAB浮点型数据的机内编码一方面对所表示数的范围做了扩充,另一方面实数编码方案存在大量存贮空间闲置。为充分利用存储资源,MATLAB软件有必要进一步优化。
[关键词]MATLAB; 浮点型数据; 机内编码;存贮空间浪费
[文章编号]1673-2944(2015)05-0045-05
[中图分类号]TP311
收稿日期:2015-03-05
作者简介:井敏英(1978—),女,陕西省富平县人,陕西理工学院讲师,硕士,主要研究方向为信号处理。
MATLAB是全世界最流行、应用最广泛的科学与工程计算软件之一[1],在工程领域有广泛应用[2-4],与其它软件也有很好的结合性[5-7],但对MATLAB中实数的机内编码研究较少。王正林等[8]给出的MATLAB数值型数据的表示范围是不准确的,并且未涉及数据的机内编码方案。龙姝明、陈爱民等[9-10]虽然准确讨论了实数的机内编码、表数范围及有效位数等实数编码相关问题,但仅仅是C语言的实数编码方案,并且未指出编码方案存在存贮空间浪费现象。实验表明,MATLAB浮点数编码方案有一部分与C语言一致,也有为了扩大表数范围而做出的扩展,扩展部分与C语言实数编码方案不同,MATLAB浮点数编码方案扩展未见文献报道。本文以MATLAB软件2012a为基础,对单精度实数和双精度实数的机内编码形式进行了实验研究,给出MATLAB的实数编码方案的全部及其表数范围和量化阶,并指出MATLAB实数编码方案存在的存贮空间浪费现象。
1单精度实数的机内编码方案与空间浪费
MATLAB中single表示单精度实数,每个数据占4 B空间,即32 bit,按绝对值大小不同分别有两种编码方案。绝对值范围为[2-126,2127(2-2-23)],并且量化阶为2-23=1.192 1×10-7的数称为大单精度实数(singlebig),MATLAB对这类数的编码方案与C语言编码方案完全一致,这类编码方案表示的十进制数绝对值范围为1.175 5×10-38~3.402 8×1038,现行文献[8]给出的单精度实数编码方案中的表数范围实际是大单精度实数的表数范围,对应尾码方案中的h=1。
MATLAB中绝对值范围为[0,2-126-2-149],并且量化阶为2-149=1.403×10-45的数称为小单精度实数(singlesmall),相应编码方案中尾码方案中的h=0。这类实数的编码方案是全新的,而且是MATLAB特有的,没有C语言对应,到目前为止没有文献报道。
1.1 大单精度实数的机内编码方案
在MATLAB中实数可以规范为
(1)
机内编码方案为SET,其中,S为数符码,E=p+127为指数码,h+T为尾码。S=0(表示正实数)或1(表示负实数)。
绝对值范围为[2-126,2127(2-2-23)]的实数称为大单精度实数(singlebig),h=1,指数码中p的取值范围为-126≤p≤127,指数码取值范围为1≤E≤254,尾数码中T的取值范围为0≤T≤1-2-23。存储时在4 B空间中S、E、T分别占用1、8、23个bit,h=1默认不用存储,其存储格式为:
S8 bitEcode23 bitTcode
按照编码方案SET,绝对值最小的非0实数是2-126=1.175 5×10-38,编码方案中的E=1=(0000 0001)2=01(H),T=0,S=0或1,这个数的十六进制码为0080 0000(H)(2-126)或8080 0000(H)(-2-126)。绝对值最大的实数是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,这个数的十六进制机内码为7f7f ffff(H)(正数)或ff7f ffff(H)(负数)。在MATLAB软件命令窗口中,输入realmin(′single′)运行给出1.175 5×10-38,输入realmax(′single′)运行给出3.402 8×1038,其中realmin和realmax为MATLAB内部函数。输入
format hex;x=single([2^-126,-2^-126])
y=single([2^127*(2-2^-23),-2^127*(2-2^-23)])
运行后给出绝对值最小、最大的“大单精度实数”的十六进制机内编码。
实验发现,在MATLAB的大单精度实数编码方案SET中,S=0,T=0,p=128,E=p+127=255的编码表示正无穷大Inf,它的32 bit二进制机内码7f80 0000(H)对应2128:
01111 11110000 0000 0000 0000 0000 000
S=1,T=0,p=128,E=p+127=255的编码表示负无穷大-Inf,32 bit二进制机内码ff80 0000(H)对应-2128:
11111 11110000 0000 0000 0000 0000 000
非数符号NaN的机内编码ffc0 0000(H)对应(-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;“大单精度实数”编码方案中,数的量化阶为2-126×2-23=2-149=1.401 298 5×10-45≈0.000 000 1×10-38;大单精度实数只有23位尾数,所以对应十进制数的有效位数为lg 223=6.923 689 9≈7位。
编码实例,实数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)。为了验证编码的正确性,在MATLAB软件命令窗口中输入命令
format hex;x=single(-128.5)
运行后得到xSET=c300 8000(H),实验验证了结果的正确性。
在“大单精度实数”编码方案SET中,绝对值大于2127(2-2-23)的数均视为无穷大,绝对值小于2-126的所有实数均视为0。为了扩展实数在区间[0,2-126)上的表数精度,MATLAB增加了“小单精度实数”编码方案。
1.2 小单精度实数的机内编码
绝对值范围在[0,2-126-2-149]内的实数称为小单精度实数(singlesmall),编码方案还是SET,与大单精度实数编码方案不同的是h=0。其中,E=p+126=0固定不变,尾数T取值范围为:0≤T<1-2-23。由于2-126-2-149=2-127(2-2-22),所以对应p=-127,E=p+127=0对应的8bit指数码为0。特别h=0不需要存贮。存储格式为:
S0000 000023bitTcode
按照式(1)的编码方案,实数x=2-127=2-1262-1,32位二进制机内编码为xSET=(0 0000 0000 1000 0000 0000 0000 0000 000)2=0040 0000(H),与实验结果相同。
在MATLAB软件中,由于对实数编码方案做了扩展,所以小于2-126的单精度实数,编码并不为0。例如8bit指数码全0的机器码0000 0001(H)=2-1262-23=2-149=1.401 3×10-45。绝对值小于等于2-1262-24的实数,机内编码为0000 0000(H)。单精度实数的量化阶为1.401 3×10-45=2-149。小单精度实数表示数的绝对值范围为0~1.175 5×10-38(即0~2-126-2-149)。
总之MATLAB单精度实数编码方案扩充之后,能表示的实数绝对值在[0,2127(2-2-23)]范围内,数的量化阶为2-149=1.401 3×10-45。
1.3 单精度实数编码方案的存贮空间浪费
单精度实数(single)的8位指数码全1时,数符码和尾码有224个状态不能用来表示数,其中有两种状态分别表示Inf和-Inf,另有一种状态表示NaN,所以单精度实数编码方案SET共有232-(224-3)=4 278 190 083个表数状态,其中224-3=16 777 213个表数状态无法有效利用,或者说MATLAB的单精度实数编码方案造成了224个状态只能用来表示3个数,即Inf、-Inf、NaN。可见MATLAB实数编码方案相对C语言有“小实数”的扩展,但仍然造成实数存贮空间有16 777 213个表数状态无法有效利用的大量空间浪费现象。
2双精度实数(double)的机内编码方案与存贮空间浪费
2.1 大双精度实数的机内编码方案
doublebig表示大双精度实数,每个数据占8B空间,表数的绝对值范围为[2-1 022,21 023(2-2-52)],即[2.225 1×10-308~1.797 7×10308],相应编码方案仍然为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个bit,h=1不用存贮。其存储格式为:
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)编码方案,实数x=128.75=(-1)027(1+2-8+2-9),E=7+1 023=1 030,S=0,T=2-8+2-9,它的机内编码为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运行后给出的实验结果相同。
实验发现,在MATLAB的大双精度实数编码方案SET中,S=0,T=0,p=1 024,E=p+1 023=2 047的编码表示正无穷大Inf,它的64bit二进制机内码8ff0 0000 0000 0000(H)对应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的编码表示负无穷大-Inf,64位二进制机内码fff0 0000 0000 0000(H)对应-21 024:
11111 1111 1110000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
非数符号NaN的机内编码fff8 0000 0000 0000(H)对应(-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;“大双精度实数”编码方案中,数的量化阶为2-1 022×2-52=2-1 074=4.940 656 458 412 465×10-324;大双精度实数有52位尾数,所以对应十进制数的有效位数为lg252=15.653 56≈16位。
在MATLAB大双精度实数的编码方案SET中,绝对值超过21 023(2-2-52)的实数视为无穷大,但绝对值小于2-1 022=2.225 1×10-308的实数并不等于0,这说明MATLAB对双精度实数的编码方案SET做了扩展,也就是说,在MATLAB中存在“小双精度实数”。
2.2 小双精度实数的机内编码
小双精度实数(doublesmall)表示数的绝对值范围为[0,2-1 022-2-1 074],编码方案还是SET,与大双精度实数编码方案不同的是h=0。因为2-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对应的机器码的编码格式为:
S0000 0000 00052bitTcode
实数的绝对值小于等于2-1 023(2-2-51)后,编码方案按式(1)进行,p=-1 023固定不变,即指数码11位二进制位全为0,而且0≤T<1。
例如2-1 022>2-1 023(2-2-51),所以是按大双精度实数编码,机器码是2-1 022(1+T)=0010 0000 0000 0000(H),其中T=0。又例如,2-1 023<2-1 023(2-2-51),按小双精度实数编码,2-1 023=2-1 0222-1的机器码是0008 0000 0000 0000(H),注意其中指数码为0。实数2-1 0222-53的编码为0000 0000 0000 0000(H)。实数2-1 0222-52=4.940 7×10-324编码为0000 0000 0000 0001(H)。可见,双精度实数的量化阶为2-1 074=4.940 656 458 412 465×10-324。小双精度实数表示数的绝对值范围为0~2.225 073 858 507 201×10-308(即0~2-1 022-2-1 074)。
2.3 双精度实数编码方案的存贮空间浪费
双精度实数(double)的11位指数码全为1时,数符码和尾码共有253种状态不能有效地表示数,其中有两种状态分别表示Inf和-Inf,另有一种状态表示NaN,所以双精度实数共有264-(253-3)=18 437 736 874 454 810 624个有效的表数状态,存在253-3=9 007 199 254 740 989个状态不能表示实数,或者说MATLAB的双精度实数编码方案造成了253个存数状态只能用来表示3个数,即Inf、-Inf、NaN,编码方案造成了大量的存贮空间浪费。
3MATLAB与C语言实数机内码编码方案比较
在C语言中,将实数规范为
(2)
单精度和双精度实数采用的编码方案均为SET,而长双精度则采用SE1T编码方案[9]。
在MATLAB中,实数规范为
(3)
编码方案均用SET,但对大实数h=1,小实数h=0。于是两种方案表示的实数精度和范围各不相同。其异同见表1。
表1 实数的 C语言编码方案与 MATLAB编码方案比较
由表1可见,实数的C语言编码和MATLAB编码都存在存储空间浪费现象。C语言实数编码中无正负无穷和非数概念,但是有上溢出和下溢出现象。MATLAB的实数编码方案中有正负无穷和非数3个状态的编码,但无溢出现象,更重要的是MATLAB编码扩展了机内单、双精度实数的表数范围,大幅度减小了实数量化阶。相比之下MATLAB的实数编码方案优于C语言的实数编码方案。
4结语
MATLAB为了提高实数编码的表数精度和表数范围,对编码方案做了扩展,加入“小实数概念”:singlesmall和doublesmall,结果大幅度减小了实数机内存贮表示的量化阶,单精度实数的机内表示量化阶为2-149=1.401 298 5×10-45,双精度实数的机内表示量化阶为2-1 074=4.940 656 458 412 465×10-324,相对C语言的实数编码方案,MATLAB实数机内表示的精度明显提高,表数范围在接近0的空间上有明显的扩展。但是MATLAB实数机内编码方案仍然没有解决实数存贮空间的大量无效表数状态造成的空间浪费的问题。
建议MATLAB研发团队将来能够通过重新选择正负无穷和非数的机内编码来解决这一问题。如果将单精度或双精度实数的8位或11位指数码全置1,然后利用23位或52位尾码写入有用信息,则可以达到在MATLAB环境中加密信息的特殊效果,因为这时MATLAB看到的这组信息仅仅是正负无穷和非数符号组成的密文信息。
[参考文献]
[1]郑阿奇,曹弋.MATLAB实用教材[M].北京:电子工业出版社,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混合编程在图像处理中的应用[J].计算机应用与软件,2012,29(1):273-275.
[6]马培勇,罗红润,周思柱.基于COM组件的MATLAB和VB混编方法在机械可靠性工程中的应用[J].计算机应用与软件,2012,29(7):189-191.
[7]宋广东,王昌,王金玉,等. 基于DLL技术和COM组件技术实现LabVIEW和MATLAB混合编程[J].计算机应用与软件,2013,30(1):287-289.
[8]王正林,刘明.精通MATLAB7[M].北京:电子工业出版社,2006:62-67.
[9]龙姝明.实数机内码的实验研究[J].汉中师范学院学报,2000,18(3):86-91.
[10]陈爱民,毛莉珍.TurboC中两个浮点数问题分析[J].宁德师范学院学报:自然科学版,2013,25(4):371-372.
[责任编辑:谢 平]
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