float和double类型的内存分布
来源:互联网 发布:linux压缩文件夹zip 编辑:程序博客网 时间:2024/05/17 06:21
C/C++的浮点数据类型有float和double两种。
类型float大小为4字节,即32位,内存中的存储方式如下:
符号位(1 bit) | 指数(8 bit) | 尾数(23 bit) |
类型double大小为8字节,即64位,内存布局如下:
符号位(1 bit) | 指数(11 bit) | 尾数(52 bit) |
符号位(1 bit) | 指数(8 bit) | 尾数(23 bit) |
符号位(1 bit) | 指数(8 bit) | 尾数(23 bit) |
符号位决定浮点数的正负,0正1负。
指数和尾数均从浮点数的二进制科学计数形式中获取。
如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1),由此可知指数为1,尾数(即科学计数法的小数部分)为01。
根据浮点数的存储标准(IEEE制定),float类型指数的起始数为127(二进制0111 1111),double类型指数的起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。所以float和double类型分别表示的2.5如下(二进制):
符号位 | 指数 | 尾数 |
0 | 1000 0000 | 010 0000 0000 0000 0000 0000 |
0 | 100 0000 0000 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 </TD< p> |
浮点数2.5可以用二进制小数准确表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小数不可以准确表示,其二进制形式的小数部分会无限循环,如浮点数-1.2表示如下(二进制):
符号位 | 指数 | 尾数 |
1 | 0111 1111 | 0011 0011 0011 0011 0011 010 |
1 | 011 1111 1111 | 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 |
由于对无限循环尾数的截取遵循0舍1入,尾数的第21~24位为0011,第53~56位为0011,而float尾数容量为23位,double尾数容量为52位,所以,float形式的最后三位因进位而成010,double形式则没有进位发生。
类型float和double通过==,>,<等比较不会引起编译错误,但是非常可能得到错误的结果。这是因为它们的内存分布不同,不可以直接比较。正确的方法是转换为同一类型后比较两者差值,如果结果小于规定的小值,则视为相等。
如,一个比较double的实现:
http://metasharp.net/index.php?title=How_to_compare_double_or_float_in_Cpp
另外,本文参考了如下webs:
http://cdatatype.blogspot.com/2008/01/memory-map-of-floatdouble.html
http://blog.csdn.net/hzb1983/archive/2007/09/24/1798555.aspx
P.S.
1)
IEEE浮点数标准: 4字节浮点数:1位符号位,8位阶数(基数为127的移码),23位尾数; 8字节浮点数:1位符号位,11位阶数(基数为1023的移码),52位尾数
2 )
在VC中: float数值范围约在 -10e38~10e38,并提供7位有效数字位,绝对值小于10e38地数被处理成零值 double数值范围约在-10e308~10e308,并提供15~16位有效数字,绝对值小于10e308地数被处理成零值
0
上一篇:JVM学习笔记十一 之 编译期优化和运行期优化
下一篇:更好更快更高效解析JSON说明[json-c]
相关热门文章
- 利用进程信息追查内存泄漏...
- 企业无线网络案例-二层漫游...
- 在 CentOS 7.1 上安装分布式存...
- MySQL新特性之mysql_config_ed...
- SAP修改消息内容和报错类型(OB...
- A sample .exrc file for vi e...
- 游标的特征
- IBM System p5 服务器 HACMP ...
- busybox的httpd使用CGI脚本(Bu...
- Solaris PowerTOP 1.0 发布
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- float和double类型的内存分布
- float和double类型的内存分布和比较方法
- float和double类型的内存分布和比较
- float和double类型的内存分布和比较方法
- float和double类型的内存分布和比较方法
- float和double类型的内存分布和比较方法
- float与double类型的内存分布,精度和范围
- float与double类型的内存分布,精度和范围
- float与double类型的内存分布,精度和范围
- float与double类型的内存分布,精度和范围
- [C/C++] float和double类型的内存分布和比较方法
- float和double类型的内存分布和比较方法收藏
- 【转】float和double类型的内存分布和比较方法收藏
- [C/C++] float和double类型的内存分布和比较方法
- float和double类型的内存分布和比较方法收藏
- float和double类型的内存分布和比较方法收藏
- C语言:float和double类型的内存分布和比较
- mysql float和double类型的区别
- 获取Java项目根目录 N多方法(转载)
- appledoc格式
- 世界首富如何炼成? 看盖茨20条箴言
- Java异常处理--将try/catch区段置于循环之外
- JVM学习笔记十一 之 编译期优化和运行期优化
- float和double类型的内存分布
- 更好更快更高效解析JSON说明[json-c]
- 通宵教室
- windows socket select非阻塞实例
- 在非控制台程序中打印出printf
- 如何将动态链接库(C++ DLL)中的printf显示在其被调用的程序控制台上
- Android NDK Build 参数
- [VC]setsockopt 设置socket 详细用法(超时、非阻塞等)
- C++结构体实例和类实例的初始化
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
内蒙古兽医
自学兽医
兽医站
执业兽医师
畜牧兽医站
兽医 络缤
兽医学
学兽医
兽医学院
兽医培训班
在线兽医
兽医网站
学习兽医
兽医培训
兽医技校
猪场兽医
在哪学兽医
兽医在哪学
咨询兽医
兽医考试
兽医师
怎么学兽医
兽医证
兽医怎么考
兽医大学
兽医教材
兽医来了
畜牧兽医局
兽医执业
兽医自学
兽医在线
高级兽医师
兽医硕士
畜牧与兽医
畜牧兽医所
山东畜牧兽医职业学院
全国执业兽医资格考试
执业兽医资格考试
兽医狂妃皇叔逆天宠
帝国第一兽医
异界兽医txt下载