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 的存储方式相关推荐

  1. float类型的存储方式

    float类型的存储方式 float的存储格式 实例分析 示例代码 GDB查看实际存储 float的存储格式 float类型又称为单精度浮点类型,在 IEEE 754-2008 中是这样定义它的结构的 ...

  2. 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 ...

  3. 关于float/double的取值范围、精度和表示

    https://blog.csdn.net/shenziheng1/article/details/79471340 1.float和double的范围和精度 float和double的范围是由指数的 ...

  4. 浮点数在计算机中存储方式float,double)---转

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...

  5. c语言double存储方式,C - float和double在内存存储解析

    float和double在内存存储解析 C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储. float数据占用32bit,double数据占用64bit. 我 ...

  6. c语言指数部分尾数部分,C语言中 float double在内存中的存储

    C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用 64bit,我们在声明一个变量float f= 2.2 ...

  7. C语言int类型和float浮点型数据在内存中的存储方式

    int 类型在内存中占4个字节,而一个字节是8个比特位,所以int类型占32个比特位. float类型在内存中同样也占4个字节,所以其也是占32个比特位. 一个比特位就是一个0或1,所以其在二进制位数 ...

  8. 22.25在计算机中如何储存,浮点数在计算机中存储方式

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...

  9. 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 ...

最新文章

  1. git 拉取远程分支及修改远程仓库地址
  2. 将CSDN600W用户及密码帐号存入本地MySql数据库
  3. boost::maximum_weighted_matching用法的测试程序
  4. Git学习第三课 使用github创建一个新的项目
  5. C++友元函数、友元类与类模板
  6. hbase 客户端_读《HBase权威指南》 客户端API:基础知识
  7. python基础2-数据及字符串知识学习
  8. java项目-基于SSM实现物流信息管理系统
  9. Python使用random实现双色球、大乐透随机选号
  10. 一步步破解app协议第二步(审计代码)
  11. 前端开发者常见的英文单词汇总
  12. pip 在c盘的文件路径
  13. 微信公众号粉丝维护怎么做?
  14. linux内核代码_解决Linux内核代码审阅者短缺的问题
  15. ASP.NET Web程序设计 第四章 系统对象
  16. 一个人越想挣钱,越挣不到钱!背后的原因是什么?
  17. 丈夫三次“买凶杀妻” 妻子毫无所觉称婚姻甜蜜
  18. 小米电视es65、ea65、ex65和ec65区别
  19. 2000元平板电脑推荐2023 2000元左右平板电脑哪款好
  20. 中央大学计算机学什么,中央大学讲解

热门文章

  1. ADSL Modern+无线路由实现无线上网
  2. 国内云存储产品应用简介
  3. LINUX下如何重启动网络服务
  4. HDU - 5157 Harry and magic string(回文自动机)
  5. POJ - 3417 Network(树上差分)
  6. mysql 5.6 初始化_MySQL 5.6 关于登陆的初始化设置
  7. sqlite java blob_【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例
  8. mysql innodb索引覆盖_Mysql InnoDB 覆盖索引与回表
  9. HOOK -- IAT HOOK 本进程MessageBox
  10. Zookeeper 安装和配置---学习三