C语言中DOUBLE型数据储存结果

C语言中DOUBLE型数据储存结果,第1张

float与double类型的内存分布,精度和范围

内存分布:

C/c++的浮点数据类型有float和double两种。

float大小为4字节,内存中的存储方式如下:

符号位(1bit)指数(8bit)尾数(23bit)

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位可以计算。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6672431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存