搜索
您的当前位置:首页正文

C++浮点型数据存储格式研究

来源:抵帆知识网
第9卷第9期 2 0 1 0年9月 南阳师范学院学报 Journal of Nanyang Normal University V01.9 NO.9 Sep.2010 C++浮点型数据存储格式研究 程 宁 ,崔 凯 (1.南阳师范学院计算机与信息技术学院,河南南阳473061; 2.河南省信息咨询设计研究有限公司软件开发处,河南郑州450008) 摘 要:浮点型数据的存储格式遵从IEEE 754标准,在计算机程序设计语言中有很重要的意义.在研究IEEE 754的存 储原理、实现方法的基础上,通过实验给出在c++中一个浮点数的存储格式和实现程序,提出正确理解问题的方法. 关键词:C++;浮点数;存储格式 中图分类号:TP 3O 文献标识码:A 文章编号:】671—6132(2010)09—0059—04 在计算机C++程序设计语言中,浮点数的表 示与使用一直是一个重点、难点.浮点型数据的二 进制存储格式是一个比较难以理解和描述的问题, 不同的教科书采用不同的讲解方法,个别还存在概 念上的错误,给学习、理解和正确使用带来误导. 制定的二进制浮点运算标准.标准规定了三种浮点 数的表示方式:单精度浮点数、双精度浮点数和扩展 双精度浮点数.标准中二进制浮点数由符号位、阶码 和尾数三部分构成,二进制浮点数基数为2,由于规 c++浮点数存储结构,在设计初期充分考虑到了 它的简单性、可移植性、稳定性和安全性,遵从了与 C/C++相同的方式,使用IEEE 754二进制浮点数 运算标准,将浮点型数据分为:单精度浮点型 (float)、双精度浮点型(double)和扩展双精度浮点 型(1ong double). 格化方法,尾数最高位数字位总是1,表示为1.f, IEEE 754二进制浮点数运算标准将尾数最高位1隐 含,使尾数表示的数据范围比实际存储的多1位. 按照IEEE 754二进制浮点运算标准,单精度 浮点数fp 山和双精度浮点数fp 。 可以表示为: fp k=(一1) ×1.f×2 一 fpd。 bl =(一1) ×1.f×2“ ‘ 1 IEEE 754二进制浮点数运算标准 1.1浮点数 计算机中数据的基本类型包括整型、实型和字 符型三大类.实型数据的存储格式相对于整形、字 符型复杂很多,一般使用浮点表示法来表示实数型 数据.浮点型数据是指采用指数方法,利用小数点 式中:S为符号位,f为尾数,exp为阶码. (1)符号s决定浮点数是正数或负数,S=0为 正数,S=1为负数,对于数值0的符号位特殊处理. (2)尾数f是二进制小数,用源码表示,f= M一1,f的数值范围为0≤f<1. (3)阶码exp是指数E的移码…,单精度浮点 数exp=E+127,双精度浮点数exp=E+1023. 的位置可以根据需要左右浮动,灵活地表示更大范 围内的实型数据. 一IEEE 754二进制浮点运算标准存储格式为: 单精度浮点数占用32个二进制位(4个字节)、双 精度浮点数占64位(8个字节)、扩展双精度浮点 数占79位以上.单精度二进制浮点数在内存中的 存储格式如图1所示. 个浮点数Ⅳ可以由两个数 和E来表示: N=M×B ,其中 为基数,E为指数, 为尾数, 是形如±d.ddd...ddd的n位数,如果M的第一位 是非0整数,即0<d<B,M称作规格化.规格化规 定有效数字的最高位必须非零,符合该标准的数称 为规格化数(Normalized Numbers),否则称为非规 格化数(Denormalized Numbers).浮点数都是近似 3l 30 23 22 O 图1 单精度浮点数存储格式 表示实数的,数据精度由尾数 决定,数的表示范 围由B和 决定. 1。2 IEEE 754 图1符号S占1位、阶码exp占8位、尾数f占 23位,尾数f是第0~22位,阶码E是第23~30 位,第31位存放符号位S. IEEE 754是电子电气工程师协会 IEEE(Insti一 tute of Electrical and Electronics Engineers)1985年 收稿日期:2010—06—05 双精度浮点数内存存放格式和单精度浮点数 相似,双精度浮点数占用8个字节共64位内存单 作者简介:程宁(1983一 ),河南南阳 ,助教,主要从事计算机教学、计算机应用方面的研究 南阳师范学院学报 第9卷 元,0~51共52位存放尾数f;52~62位共11位存 放阶码exp;第63位存放符号s,如图2所示. ! l ::! I 6 3 62 52 5l O 图2双精度浮点数存储格式 IEEE 754二进制浮点运算标准阶码部分使用 移码形式表示,实际值为二进制指数值与一个固定 值(127或1023)的和.因为,指数的值可能为正也 可能为负,如果采用补码表示的话,全体符号位s 和E自身的符号位将导致不能简单地进行大小比 较.所以,指数部分通常采用一个无符号的正数值 存储.单精度阶码的值是一126~+127加上127, 得1~254(0和255是特殊值),最小值为1,最大 值为254.浮点数计算时,指数值减去移码值就是 实际指数大小.在IEEE 754标准中,尾数F的值是 去掉小数点前边的一位,通常这位数就是1,这样 实际上使尾数的有效位数为24位,即尾数为1.f. 1.3二进制浮点数特殊值 IEEE 754中所有的数字位都得到了使用,通 过定义明确地表示了数值0和无穷大.在IEEE 754二进制浮点运算标准中当阶码取值为0、255 或尾数为0、全1等情况时,浮点数的值根据符号 s、阶码exp和尾数f有特殊的定义.阶码exp的取 值范围为1~254,最小值exp i =1,最大值exp… =254,根据尾数f的不同,浮点数数值的定义见 表1. 表1 IEEE 754二进制浮点运算标准数值表示 表1中E为指数,单精度浮点数E=exp一 127,双精度浮点数E=exp一1023,NaN(Not a Number)为非数值.当阶码exp=exp…一1为全0, 尾数f=0时,浮点数的值为±0,当阶码exp= exp…+1为全1,尾数f=0时,浮点数的值为± ∞,尾数f≠0时浮点数为NaN非数值.所以,特殊 浮点数±0和±o。的IEEE 754二进制浮点运算标 准存储格式见表2. 2 C++中的浮点数 c++中基本数据类型分为整型、实型、字符型 等,其中实型又称为浮点型,分为单精度浮点型、双 精度浮点型和长双精度浮点型.c++浮点型数据 在内存中的存储格式按照IEEE 754二进制浮点数 运算标准存储,单精度浮点型占4个字节,双精度 浮点型占8个字节,长双精度浮点型可用64位、8O 位或128位表示,在常用的Visual C++6.0编译 系统中用64位表示,占8字节.C++浮点型数据的 数据类型 见表3. 表2 IEEE 754二进制浮点运算标准特殊值 类型名 长度(字节) 取值范围 设x=3.14159,根据IEEE 754二进制浮点数 运算规范,用单精度浮点型和双精度浮点型分别计 算X在内存中的存储形式. (1)单精度浮点型方式存储: X=3.14159的二进制表示为: X:11.00100100001l11l101 规格化二进制表示为: x=1.10010010001111t01×2’. 所以S=0 exp:127+1=128,二进制为10000000. f=1OO10Ol000lll1l01 单精度浮点数x在内存中的存储形式为: 0100 0000 0100 1001 0000 111t 1101 0000, 十六进制表示为40 49 OF DO. (2)双精度浮点型方式存储: X=3.14159的二进制表示为: X=l1.O010Ol0000111lllO0l11l1ll1O11l0l O11100001l0 规格化二进制表示为: X=1.100l00100001l1111001ll1111l01l10 101110000110×2 S:0 exp=1023+1=1024,二进制为10000000000 共11位. f=10010010000ll111l001l11111lO11l010ll 100001 lO 双精度浮点数x在内存中的存储形式为: 0100 o000 0000 100l 0010 000l l11l 1001 1111 1110 1110 1011 1000 0110,十六进制表示为 40 09 21 fe eb 86 6e. 第9期 程 宁等:c++浮点型数据存储格式研究 ・6l・ 3 实验 以下程序可以计算和验证c++中浮点数在内 存中的存储方式,在Visual C++6.0中输入,编辑、 编译运行程序,输入一个单精度浮点数和输入一个 双精度浮点数程序给出该双精度数在内存中的二进 制存储形式 引.通过运行程序可以进一步理解C++ 浮点数存储原理和验证浮点数的存储格式. 3.1 单精度浮点数计算程序 #include<iostream> #include<emath> using namespace std; void main() {float x,f=0; int a,i,j=0,k,l; char b[23],c[23],d[8]={0},t[32]; cout<<”请输入一个单精度浮点数:”; cin>>x: if(X:=0、 {tout<<”IEEE 754单精度0:O0 00 00 00或 80 00 00 00”<<endl: return; } if(X>=0)t[31]=0+48; else t[31]=1+48; X:labs(X); if(X>=1)//大于等于1的浮点数 {a=int(X); f=x~a: for(i=0;a>0;i++)//计算整数部分 {b[i]=a%2+48; a=a/2; j++; } for(i=0;i<:22;i++)//计算小数部分 {f=f 2.0; c[i]=int(f)+48; if(f>=1.0)f=f一1; } } else//小于1的浮点数 {int flag=0; f=x: for(i=0;i<=23;) {f=f 2.0; if(f<1&&flag==0)j++; else {c[i]=int(f)+48; if(f>=1.0)f=f一1; lfag:1: i++: } j=一J; f int e=127+J一1;//求阶码 for(i=0;i<8;i++) {d[i]:e%2+48; e=e/2; } for(i=0;i<8;i++) {t[i+23]=d[i];} k=J一1—1,1=22; for(;k>=0;k一一,l一一) {t[1]=b[k];} if(X<1)k=1; e]se k=0; for(;1>:0;1一一,k++) {t[1]=c[k];} eout<<”IEEE 754浮点数存储格式:”<< endl; for(i=31;i>=0;i一 一) {eout<<t[i]; if(i%4==0)eout<<””; } eout<<endl: re[tlrn; } 输入单精度浮点数3.14159,程序运行结果如 图3所示. 程序按照IEEE 754二进制浮点数运算标准,通 过计算得到单精度浮点数3.14159的二进制浮点数 格式为0100 0000 0100 1001 0000 1111 1101 0000,十 六进制为40 49 0F D0,与前边分析结果一致. 图3 IEEE 754二进制浮点数存储格式计算 3.2浮点数存储格式验证程序 #include<iostream> using namespaee std; llilion FData { lfoat f; 南阳师范学院学报 double d; 第9卷 f.displayf(); f.setd(); f.displayd(); unsigned char C[8]; }; class F1 } 取单精度浮点数3.14159和双精度浮点数 { private: 3.14159输入程序中,运行结果如图4所示. FData fd; public: void serf() {cout<<”输入一个单精度浮点数:”<< endl; ein>>fd.f: } void setd() 图4浮点数在内存中的存储格式显示 {cout<<”输人一个双精度浮点数:”<< endl; cin>>fd.d: 程序的功能为,通过键盘输入单精度数和双精 度数,根据联合型数据类型的特点,将系统自动存 储在内存中的单精度浮点数或双精度浮点数的二 进制值直接显示打印,以查看C++中浮点数在内 存中的存储格式.通过图4结果可以看出单精度浮 点数3.14159的十六进制存储格式为4O 49 0f d0, 与前边分析完全吻合. } void displayf() {cout<<fd.f<<”在内存中的存放为:”; for(int i=3;i>=0;i一一) printf(”%2x”,fd.e[i]); cout<<endl: 4 结束语 c++中数据类型和每种类型在内存中的存储 方式是学好c++的基础,每种类型的存储方式都 有它自己的含义,特别是浮点数的存储是学习的一 个重点和难点,通过对IEEE 754浮点数存储规范 的理解和对具体实例的实际演算,对程序结果的分 析调试,对于学好、用好C++具有重要的意义. } void displayd() {cout<<fd.d<<”在内存中的存放为:”; for(int i=7;i>=0;i一一) printf(”%2x”,fd.C[i]); cout<<endl: } }; void main() 参 考 文 献 [1]蒋本珊.计算机组成原理[M].北京:清华大学出版 社,2004:26—30. { Fl f: [2] 郑莉.C++程序设计语言[M].北京:清华大学出版 社,2004:24. f.serf(); [3] 陈爽,等.浮点加法的SystemC设计[J].微处理机, 2008(5):21—23. Research on the storage format of floating-point numbers in C++language CHENG Ning ,CUI Kai (1.School of Computer and Information Technology,Nanyang Normal University,Nanyang 473061,China; 2.Software Development Department,Henan Province Information Consultation Designing Research Co.LTD,Zhenzhou 450008,China) Abstract:The storage format of floating-point numbers complies with the standard of IEEE 754,which make it take very important role in the computer programming language.The article researches how to compute and im— plement the floating-point numbers based on binary format according with IEEE 754,gives the storage format of lfoat and implementation procedures in C++based on the experiment and comes up with the proper teaching method. Key words:C++;float;storage format 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top