版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_26940175/article/details/51894751
今天,看到一篇关于浮点数在内存中的存储问题,发现两个例子都问题,所以写了这篇关于浮点数的存储问题。
我们用一个个例子说话。
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:例子不正确