float与double在内存中的储存及范围,精度

浮点型

float double
字节数 4字节(byte) 8字节(byte)
位数 32位(bit) 64位(bit)
指数位数(阶码) 8位 11位
尾数位数 23位 52位
表示范围 3.4E–38~3.4E+38 1.7E–308~1.7E+308
精度 6~7位 15~16位

1.单精度浮点型(float)的储存

单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。
在内存中如何储存?

在这里插入图片描述(图片来自:https://blog.csdn.net/sinat_33653600/article/details/86581538)

符号位S:1位(第31位),0代表正,1代表负;
指数位E:8位(第23~30位),代表指数+127后的二进制数
底数位M :23位(第0~22位),

举个栗子:
17.625用float如何在计算机中表示?
①将17.625化为二进制,(整数部分:“除2取余数,逆序排列”,小数部分:“乘2取整,顺序排列”)
整数部分:17化为二进制为10001.
小数部分:
0.625,0.625×2=1.25;取整数部分,1
0.25×2=0.5;取整,0
0.5×2=1;取整,1
顺序排列,所以小数部分化为二进制为101
因此,17.625的二进制为10001.101

②用科学计数法表示为:1.0001101×2^4

③底数部分,1.0001101,因为第一位一定为1,那还存他干嘛呢?因此,底数部分为:0001101

④指数部分:指数为4,但是要加上127,固为131,即二进制数 10000011

⑤正数,符号位为0;综上17.625用float储存为:

符号位 阶码(指数位) 尾数(底数位)
0 10000011 00011010000000000000000

2.双精度浮点型(double )的储存

双精度型,正如它的关键字“double ”表示的,占用64位的存储空间。

符号位S:1位(第63位),0代表正,1代表负;
指数位E:11位(第52~62位),代表指数+1023后的二进制数
底数位M :52位(第0~51位)

同样举个例子:
-12.5
①负数,最高位符号位,1

②将12.5化为二进制 1100.1;

③用科学计数法表示为:1.1001*2^3
底数部分,1.1001,同样不存前面的1,因此,底数部分为:1001

④指数部分:指数为3,要加上1023,固为1026,即二进制数 10000000010
⑤正数,符综上-12.5用double储存为

符号位 阶码(指数位) 尾数(底数位)
0 10000000010 1001000000000000000000000000000000000000000000000000

3.指数部分为什么要加上123或者1023呢?

对与float ,指数位8位,能表示0~255,但是指数也有正负之分,为了均衡二者,各自一半呗,就-127~128,0,特殊处理,不管正数,负数储存时都加上127,刚好就是0~255,就比较方便得储存下来了,否则,需要判断符号位来判断数值的正负。

同理,对与double,指数位11位,正负各自一半,就是-1023~1024,所以都加上1023来储存。

4.表示范围与精度

取值范围由指数部分决定:

float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。
由于float的指数部分对应的指数范围为-128~128,所以取值范围为:
-2^128 ~2^128,约等于-3.4E38 — +3.4E38

double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。
-2^1024 ~2^1024,约等于1.7E–308~1.7E+308

精度(有效数字)主要看尾数位:

float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

参考博客:
https://www.cnblogs.com/c-primer/p/5992696.html

猜你喜欢

转载自blog.csdn.net/K__Ming/article/details/106062892