内存分布:
C/c++的浮点数据类型有float和double两种。
float大小为4字节,内存中的存储方式如下:
double大小为8字节,内存中的存储方式如下:
符号位(1bit)指数(11bit)尾数(52bit)
符号位决定浮点数的正负,0正1负。指数和尾数均从浮点数的二进制科学计数形式中获取。
如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1)。
由此可知指数为1,尾数(即科学计数法的小数部分)为01。
根据浮点数的存储标准,指数用移码表示。0的float类型移码为127(0111
1111),0的double类型移码为1023(011
1111
1111)。运算时,在0
的移码基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。
所以float和
double类型分别表示的2.5如下(二进制):
符号位
指数
尾数
0
1000
0000
010
0000
0000
0000
0000
0000
0
100
0000
0000
0100
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
精度:
float和double的精度是由尾数的位数来决定的。
float:2^23
=
8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52
=
4503599627370496,一共16位,同理,double的精度为15~16位。
范围:
float类的指数是8位移码,最大为127最小为-127,127用来作2的指数,为2^127,约等于
1.7014*10^38,
而我们知道,floa示数范围约为-
3.4*10^38-------3.4*10^38,
这是因为尾数都为1时,即1.11..11约为2,因此浮点数的范围就出来了.double的情况与float完全相似.
在显示时候调用的是Double类的toString()方法。原因如下:
而Double的toString()方法实际是调用了FloatingDecimal类的toJavaFormatString()方法,如下图
研究源码发现:科学计数法展示是因为FloatingDecimal类的decExponent属性
那么decExponent属性究竟是什么呢?简单来说,
就是小数点向左移动decExponent就是正数,向右移动就是负数。移动几位就是几。
而具体移动规则是移动到小数点左边为0,右边为非0时候停止。
float:单精度型浮点数据,double:双精度型浮点数据float和double的精度是由尾数的位数来决定的。扩展资料
浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的',故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
因为float最多能有7位有效数字, float x = 51539607552,减去1000后,有效数字不变,double x为11位可以计算。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)