单精度和双精度浮点的问题
-
数字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位小数