关于浮点数

单精度和双精度浮点的问题

  • 数字float 9.125在十进制中用科学计算的方式表示为9.125*10^0 ,但是在计算机中,计算机只认识0和1,所以在计算机中是按照科学计算的二进制的方式表示的:

    9的二进制表示为1001,0.125的二进制表示为0.001,所以9.125的表示成1001.001  将其表示成二进制的科学计数方式为 1.001001*2^3 
    在计算机中,任何一个数都可以表示成1.xxxxxx*2^n 这样的形式, 其中xxxxx就表示尾数部分,n表示指数部分. 比如这样
    
这种存储方法类似于科学计数法,其中有几点需要解释一下:

1、尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。

2、尾数的最高位始终为1的解释:二进制只有1和0两个数码,最高位也不例外,当最高位为0时,显然无意义,所以最高位必然为1。也正是这个必然,是的存储机制能节省一个bit:既然最高位必然为1,那我为什么不将这个1给省略掉?以节省一个bit的空间?所以在图二的算式中括号里面的那个1是固定的,用于补充被省略掉的最高位。

3、至于float类型的范围也不难,依照上面的算式就可以算的了。最大:valueMax=1*(1+1)*2^127约等于3.4E+38。括号中间那个求和号用等比数列求和公式求即可

​
  • 无论是float还是double,在内存中的存储主要分成三部分,分别是:

    • 符号位(Sign):0代表正数,1代表负数
    • 指数位(Exponent):用于存储科学计数法中的指数部分,并且采用移位存储(127+指数)的二进制方式。
    • 尾数位(Mantissa):用于存储尾数部分
  • 单精度和双精度都表示小数,然后存储结构为

    • 单精度(32位):1位符号 + 8位指数 + 23位尾数
    • 双精度(64位):1位符号 + 11位指数 + 52位小数
上一篇
下一篇