浮点数在内存中存储
来源:互联网 发布:qq群淘客软件 编辑:程序博客网 时间:2024/05/16 09:25
今天,看到一篇关于浮点数在内存中的存储问题,发现两个例子都问题,所以写了这篇关于浮点数的存储问题。
我们用一个个例子说话。
float:4字节(单精度) double:8字节(双精度)
单精度和双精度在存储中都分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):尾数部
单精度的存储方式如下图所示:
R32.24和R64.53的存储方式都是用科学计数法来存储数据的,
比如:
1. 4.125用十进制的科学计数法表示就为:4.125*。
在计算机存储中,首先要将上面的数化成二进制的科学计数法表示:
4.125用二进制表示可表示为100.001
任何一个数都的科学计数法表示都为1.xxx*, 尾数部分就可以表示为xxxx,由于第一位都是1,可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,
重点理解: 那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了, 所以指数部分的存储采用移位存储,存储的数据为原数据+127。
我们举两个例子就可以清楚的明白。
4.125 的二制科学计数法: 1.00001*2^2
*符号位(Sign) : 0(0代表正)
*指数位(Exponent):10000001 (2+127=10000001)
*尾数部分(Mantissa):00001
0 10000001 00001000000000000000000
通过调试我们可以看到 推理的数据是正确的。
我们再举一个例子
-8.32的二制科学计数法: -1.00001*2^3 (1000.)
*符号位(Sign) : 1(1代表负)
*指数位(Exponent):10000010 (3+127=10000010)
*尾数部分(Mantissa):00001010001111010111000 (精确度不够
)
1 10000010 00001010001111010111000
double 类似。
4.125 的二制科学计数法: 1.00001*2^2
*符号位(Sign) : 0(0代表正)
*指数位(Exponent):10000001 (2+1023=10000000001) ps: 存储的数据为原数据+1023
*尾数部分(Mantissa):00001
0 10000000001 0000100000000000000000000000000000000000000000000000
参考:http://www.cnblogs.com/xkfz007/archive/2012/02/27/2370357.html ps:例子不正确
1 0
- 浮点数在内存中存储
- 浮点数在内存中存储
- C语言中浮点数在内存中的存储格式
- C语言中浮点数在内存中的存储方式
- C语言中浮点数在内存中的存储方式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储形式
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储方式
- js ajax调用请求
- Tomcat7.0源码分析——请求原理分析(下)
- C语言setbuf()函数:把缓冲区与流相关联
- 初识、理解生成器模式
- ubuntu下安装qt
- 浮点数在内存中存储
- C#学习笔记--引用类型分类,对象类型、字符串类型、数字类型,类型转换
- yum 常用命令介绍
- 实例简述Spring AOP之对AspectJ语法的支持
- 实例简述Spring AOP之对AspectJ语法的支持
- linux第二天
- 【矩阵快速幂】[NOI2011]兔农
- TensorFlow博客翻译——TensorFlow v0.9发布,带有增强版的移动支持
- [Android] Android开发优化之——对Bitmap的内存优化