浮点数在内存中存储

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_26940175/article/details/51894751

今天,看到一篇关于浮点数在内存中的存储问题,发现两个例子都问题,所以写了这篇关于浮点数的存储问题。

我们用一个个例子说话。

float:4字节(单精度)      double:8字节(双精度)


单精度和双精度在存储中都分为三个部分:

  1. 符号位(Sign) : 0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
  3. 尾数部分(Mantissa):尾数部

单精度的存储方式如下图所示:

 

双精度的存储方式为:


R32.24和R64.53的存储方式都是用科学计数法来存储数据的,
比如:
1.    4.125用十进制的科学计数法表示就为:4.125*
clip_image0021
        在计算机存储中,首先要将上面的数化成二进制的科学计数法表示:
        4.125用二进制表示可表示为100.001
        
任何一个数都的科学计数法表示都为1.xxx* clip_image002[1] , 尾数部分就可以表示为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:例子不正确

猜你喜欢

转载自blog.csdn.net/sinat_26940175/article/details/51894751
今日推荐