浮点型在计算机中的存储
来源:互联网 发布:邮箱密码破解软件 编辑:程序博客网 时间:2024/05/22 02:50
1、内存表示
在探讨float的存储呢之前可以先说一下整型在计算机内存中的存储是补码形式,大家可以自行试验一下,包括负数的存储的形式。
1>我们在讨论浮点型在计算机中是如何存储的,首先要明白两个前提条件 (1)实型数据在计算机中以指数的形式保存(2)float在计算机中占四个字节,符号位1位,指数位8位,尾数位23位;double在计算机中占八个字节,符号位1位,指数11位,尾数52位。
2>我们还是通过简单的例子看看计算机是如何存储的
#includeint main(){ float i; i = 0.5; return 0;}
我们看到当i的值为0.5时,其对应的二进制数是0.1,
指数表示应该是1.0*2^-1内存中的值是00 00 00 3f,将它转换成大端存储为3f 00 00 00,
再转化成二进制数为0011 1111 0000 0000 0000 0000 0000 0000,
按照float数据的存储方式可以将其划分为1个符号位,8个指数位,和23个尾数位的形式,则其为0 01111110 00000000000000000000000
我们知道符号位没错是0,但是尾数为啥全部为零呢,这是因为,float存储时,不论怎么做,小数点后面总会出现一个1,这样计算机就默认一个1,这样就可以提高一个位的精度。
在解决了这个问题以后,我们又要问了,那指数位也不符合我们的要求啊。我们把指数位的数转化成十进制数为01111110(二进制)->126(十进制)
这是怎么回事呢,指数不是应该是-1吗,这和我们的126有什么关系吗,不难发现126=127+(-1)
根据以上分析我们得到计算机存储float的两个推断(1)尾数部分处理成了1.xxx * 2^n的形式(2)指数部分在原有的基础之上加127。
2、举例验证
1>比如0.25,转化成二进制就是0.01,
根据我们的推论,将其转换成指数形式就是1.0 * 2^(-2),那么尾数位还全部是0,则指数位应该是-2+127=125,
125的二进制表示应该是0111 1101,那么0.25(十进制)在内存中的表示应该是0 01111101 00000000000000000000000
2>我们来通过程序验证一下,
0.25在内存中的表示为00 00 80 3e,将其装换成小端模式为3e 80 00 00,
再将其转化成二进制为 0 01111101 00000000000000000000000,和上述我们的推断一致,证明推断正确。
此时又会问了为什么会采用这种方式进行存储呢?如果直接按照指数的存储形式,采用补码的话,我们必须要思考两个数字0.0和1.0如何存储,0.0毋庸置疑是全0,可是1.0按普通补码的形式,应该是1.0*2^0也应该是全0,但是这样不就和0.0矛盾了吗,所以需要才要指数加127的操作。
3>接下来我们验证一下0.0和1.0在计算机内存中是如何存储的。
0.0
0.0是全0
1.0
1.0是00 00 80 3f转化成小端是3f 80 00 00再转化成二进制是0 01111111 00000000000000000000000再将指数位转化成十进制是127.此时可以说我们的结论正确了。
4>综上,float在计算机内存中采取以下方式进行存储
1. 尾数部分处理成了 1.xxxx * 2^n 的格式
2. 指数部分在原有指数的基础上加了 127
3、double
double在存储上只是指数和尾数发生了变化,在具体的存储的方法上都和float一样的,在处理的时候需要把指数限度处理为11位的,在尾数上处理为52位。
4、精度
精度指测量值与真实值的接近程度,在C语言中表现为输出值和真实值的接近程。
float 和 double 的精度是由尾数的位数决定。内存中的尾数只保存了小数点后面的部分,其整数部分始终是一个隐含着的“1“,它是不变的,不会对精度造成影响。
但是float 和 double 在内存中的指数和尾数的位数都是有限的,小数过大或过小都会发生溢出。float 的取值范围为 -2^128 ~ +2^128,也即 -3.40E+38 ~ +3.40E+38;double 的取值范围为 -2^1024 ~ +2^1024,也即 -1.79E+308 ~ +1.79E+308。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即 float 的精度为 6~7 位有效数字。
double:2^52 = 4503599627370496,一共16位,同理,double 的精度为 15~16 位。
5、参考:
http://c.biancheng.net/cpp/html/3095.html
http://www.infocool.net/kb/OtherLanguage/201611/209695.html
- 浮点型在计算机中的存储表示
- 浮点型在计算机中的存储
- 浮点型变量在计算机内存中的存储格式
- C语言中整型浮点型在计算机中的存储
- C语言中浮点型在计算机中的存储
- 整型与浮点型数据在计算机内存中的存储
- 浮点数在计算机中的存储
- 浮点数在计算机中的存储方式
- 浮点数据在计算机中的存储方式
- 浮点数在计算机中的存储
- 浮点数在计算机中的存储方式
- 浮点数在计算机中的存储形式
- 浮点型数据在计算机中存储
- 浮点数在计算机内存中的存储格式
- 浮点数在计算机中的存储方式(转)
- IEEE-754标准,浮点0在计算机中的存储方式
- 数据在计算机中的存储(字节序,浮点数)
- C语言中浮点数在计算机中的存储
- 我的app思想花园使用指导
- UEFI driver & Option Rom
- 郑轻oj1877 蛤玮打扫教室
- mvc
- 使用iNode后无法连接无线网的问题
- 浮点型在计算机中的存储
- 引用、指针、const
- C2011 “timespec”:“struct”类型重定义
- oracle 查看锁表和解锁
- 搭建MySQL数据库服务RHCE-Day10
- 图像增强--空间域图像增强
- Android的系统架构
- HTTPS的交互流程
- 拐角II