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

如题所述

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完全相似.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-26
老谭的书上有:
实型数据一般占4个字节(32位)内存空间。按指数形式存储。
实数3.14159在内存中的存放形式如下:
+
.314159
1
数符
小数部分
指数
其中:
小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。
指数部分占的位数愈多,则能表示的数值范围愈大。
基础加强哟。
第2个回答  2020-02-27
这是因为,double存储的数据不存在连续性!
将一个值赋值给一个double类型变量,系统只能给它一个最接近的值.
详情,可参考double的数据结构:
http://zhidao.baidu.com/question/125054490.html
第3个回答  2019-06-08
十进制实数转化为二进制,往往不能用有限的比特数精确表示。
double型规定了用几比特作指数,几比特代表精度(即有效数字)。这对十进制实数的存储精度进一步加了限制。
相似回答
大家正在搜