float double 的存储方式
float 和 double 的表示法:
都是二进制的科学表示法:
± mantissa × 2 exponent
(mantissa:尾数,exponent:指数,均使用二进制表示)
float(浮点型)在内存中占4个字节(Byte),即32位(bit)
存储方式如下:
1 bit(符号位) |
8 bit(指数位) |
23 bit(尾数位) |
符号位:1 bit,0表正,1表负
指数为:8 bit,推算的8个bit能表示的范围为0 - 2的8次方减1,即0 - 255,但是这里的值都是加了127的,所以实际能表示的范围为:-127 - 128
尾数位:23 bit,推算得23个bit能表示的范围为0 - 2的23次方减1,即0 - 8388607,最大值为7位数,但是不能表示所有的7位数,不过所有的6位数是可以包含的,所以精度为6个有效数字(注:这也就是为什么说float的精度为6-7位,但实际能确定的只有6位)
所以我们比较两个float是否相等时,常常这样写:
const float EPSILON = 0.000001;float f1 = 123.234567;float f2 = 123.234568;if (fabs(f1-f2) <= EPSILON){cout<<"equal"<<endl;} else{cout<<"not equal"<<endl;}
最大值:由上面得指数最大为128,即此时最大值为2的128次方,为 3.402823466E+38
最小值:符号位为1时,表负,所以最小值即最大值取负的即可,为 -3.402823466E+38
当指数为-127时,决定了浮点数所能表达的绝对值最小的非零数,为1.175494351E-38
double(双精度浮点型)在内存中占8个字节(Byte),即64位(bit)
存储方式如下:
1 bit(符号位) |
11 bit(指数位) |
52 bit(尾数位) |
符号位:1 bit,0表正,1表负
指数为:11 bit,推算的11个bit能表示的范围为0 - 2的11次方减1,即0 - 2047,但是这里的值都是加了1023的,所以实际能表示的范围为:-1023 - 1024
尾数位:52 bit,推算得52个bit能表示的范围为0 - 2的52次方减1,即0 - 4503599627370495,最大值为16位数,但是不能表示所有的16位以内的数,但是所有的15位数是可以包含的,所有精度为15个有效数字
最大值:由上面得指数最大为1024,即此时最大值为2的1024次方,为 1.7976931348623158E+308
最小值:符号位为1时,表负,所以最小值即最大值取负的即可,为 - 1.7976931348623158E+308
当指数为-1023时,决定了浮点数所能表达的绝对值最小的非零数,为2.2250738585072014E-308
举个例子:
1. 得到float类型的 -10.5 的内存表示
首先得到-10.5的二进制表示法,- 1010.1,二进制的科学表示法为:- 1.0101 * 2的3次方
这样可以得到
符号位:因为是负的,所以为1
指数位:上面得到指数为3,加上127得到130,二进制表示为10000010
尾数位:只表示小数点后面的即可,即0101,后面补0即可,一共23位,需补19个0,最终二进制表示为:0101 0000 0000 0000 0000 000
最后把上面的符号位,指数位,尾数位加起来就得到了二进制表示:(红色表符号位,绿色表指数为,蓝色表尾数位)
110000010 01010000000000000000000
按照8个bit一个byte,区分开来得到
1100 0001 0010 1000 0000 0000 0000 0000 十六进制表示即为:0x c1 28 00 00
由于机器为小端,低位先存,高位后存,所以内存中实际存储为:
0000 0000 0000 00000010 10001100 0001十六进制表示即为:0x 00 00 28 c1
可以写个程序测试下,你会发现-10.5的内存表示确实是0x 00 00 28 c1
2. 一个小端机器中,float的内存数据为 0x 00 00 85 41,求这个float数
首先,由于是小端,得到原本的十六进制:0x 41 85 00 00
得到二进制数据:0100 0001 1000 0101 0000 0000 0000 0000
再以颜色区分(红色表符号位,绿色表指数为,蓝色表尾数位)
得到数据: 0100 0001 1000 0101 0000 0000 0000 0000
然后提取得到:
符号位:0,表正数
指数位:10000011,即十进制数131,减去127后得到4
尾数位:000 0101 0000 0000 0000 0000 舍去后面多余的0,即0000101
由上面公式得到,该float数据为 1.0000101 * 2的4次方,小数点右移4位,即10000.101
小数点左边数据,10000即16
小数点右边数据,0.101即1*2^-1 +0 * 2^-2 +1* 2^-3 = 0.5 + 0 + 0.125 = 0.625
最后左右加后边,即16+0.625 = 16.625
可以写个程序测试下,你会发现16.625的内存表示确实是0x 00 00 85 41
float double 的存储方式相关推荐
- float类型的存储方式
float类型的存储方式 float的存储格式 实例分析 示例代码 GDB查看实际存储 float的存储格式 float类型又称为单精度浮点类型,在 IEEE 754-2008 中是这样定义它的结构的 ...
- Float浮点内存存储方式 转
1.0f 在内存中的存储为 0 011 1111 1 000 0000 0000 0000 0000 0000. 把他按整型数解释为2^29+2^28+2^27+2^26+2^25+2^24+2^23 ...
- 关于float/double的取值范围、精度和表示
https://blog.csdn.net/shenziheng1/article/details/79471340 1.float和double的范围和精度 float和double的范围是由指数的 ...
- 浮点数在计算机中存储方式float,double)---转
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...
- c语言double存储方式,C - float和double在内存存储解析
float和double在内存存储解析 C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储. float数据占用32bit,double数据占用64bit. 我 ...
- c语言指数部分尾数部分,C语言中 float double在内存中的存储
C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用 64bit,我们在声明一个变量float f= 2.2 ...
- C语言int类型和float浮点型数据在内存中的存储方式
int 类型在内存中占4个字节,而一个字节是8个比特位,所以int类型占32个比特位. float类型在内存中同样也占4个字节,所以其也是占32个比特位. 一个比特位就是一个0或1,所以其在二进制位数 ...
- 22.25在计算机中如何储存,浮点数在计算机中存储方式
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...
- C++中,float double区别
类型 比特数 有效数字 数值范围 float 32 6-7 -3.4*10(-38)-3.4*10(38) double 64 15-16 -1.7*10(-308)-1.7*10(308) long ...
最新文章
- git 拉取远程分支及修改远程仓库地址
- 将CSDN600W用户及密码帐号存入本地MySql数据库
- boost::maximum_weighted_matching用法的测试程序
- Git学习第三课 使用github创建一个新的项目
- C++友元函数、友元类与类模板
- hbase 客户端_读《HBase权威指南》 客户端API:基础知识
- python基础2-数据及字符串知识学习
- java项目-基于SSM实现物流信息管理系统
- Python使用random实现双色球、大乐透随机选号
- 一步步破解app协议第二步(审计代码)
- 前端开发者常见的英文单词汇总
- pip 在c盘的文件路径
- 微信公众号粉丝维护怎么做?
- linux内核代码_解决Linux内核代码审阅者短缺的问题
- ASP.NET Web程序设计 第四章 系统对象
- 一个人越想挣钱,越挣不到钱!背后的原因是什么?
- 丈夫三次“买凶杀妻” 妻子毫无所觉称婚姻甜蜜
- 小米电视es65、ea65、ex65和ec65区别
- 2000元平板电脑推荐2023 2000元左右平板电脑哪款好
- 中央大学计算机学什么,中央大学讲解
热门文章
- ADSL Modern+无线路由实现无线上网
- 国内云存储产品应用简介
- LINUX下如何重启动网络服务
- HDU - 5157 Harry and magic string(回文自动机)
- POJ - 3417 Network(树上差分)
- mysql 5.6 初始化_MySQL 5.6 关于登陆的初始化设置
- sqlite java blob_【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例
- mysql innodb索引覆盖_Mysql InnoDB 覆盖索引与回表
- HOOK -- IAT HOOK 本进程MessageBox
- Zookeeper 安装和配置---学习三