目录
1:float类型和double类型的定义
我们在现实生活中经常用到10进制的数据,比如整数和小数。但是小数经常出现小数点后无限循环的情况。比如圆周率的π和1/3。这些数字想要存入计算机中。我们只能使用double和float来存储。但是计算机的内存不是无限的。我们不可能真正的存储下这些数字。
float:单精度,占用4个字节的内存空间,也就是4*8=32位二进制。
double:双精度,占用8个字节的内存空间,也就是8*8=64位的二进制。
2:二者的范围和精度
3:float类型详解
在我们了解float和double类型之前,我们首先要知道10进制转换2进制的方法。
假如现在有一个10进制的数字是3.625
3.1:整数位10进制转换为2进制
我们首先把10进制的3转换为二进制,转换过程如下(除2取余)
整数位计算:除2 | 取余 |
3/2=1 | 1 |
1/2=0 | 1 |
所以10进制的3转换为二进制就是从下往上:11
3.2:小数位10进制转换为2进制
我们首先把10进制的0.625转换为二进制,转换过程如下(乘以2,大于1取1,小于1取0)
小数位计算:乘以2 | 取整数位(从上往下) |
0.625*2=1.25 | 1 |
0.25*2=0.5 | 0 |
0.5*2=1 | 1 |
所以10进制的0.625转为二进制就是从上往下:101
那么得出结论10进制的3.625转换为二进制就是11.101
我们从验证工具得知
3.3:把二进制放到浮点类型中
从上边我们知道 3.625(10进制)=11.101(二进制)
在10进制下: 14.25=1.425*10^1
在二进制下: 11.101=1.1101*2^1
符号位:0代表正数,1代表负数
指数位:存储指数
底数位:存储底数
3.625(10进制)=11.101(二进制)=1.1101*2^1(二进制)
3.625的二进制标准格式是11.101
0.625的二进制标准格式是0.101=1.01*2^-1
为什么不是使用标准格式来作为存储格式?
设想一下,假如是使用标准格式来作为存储格式,是不是需要规范前几位为整数位,后几位为小数位。比如前8位作为整数位,那如果现在的数据内容整数位为0,如0.625……的话,就浪费了前八位的空间,这个浪费是以牺牲小数精度为代价。所以才有了存储格式这么个东西。
符号位最简单,表示正负。
在介绍指数位之前,先了解尾数位:
尾数位实际上是还有一个隐藏位为1在尾数位的左侧。
如3.625的二进制格式:(1即是指数位)
(如果不能理解的话,可以将二进制转为10进制来理解:
那么分析3.625的二进制
符号位:0
指数位:指数位是1,用8位来存储指数,范围是0-255(10进制),0-126代表负数,127代表0,128-255代表正数,再结合余127码,他应该存储1+127(10进制)即1000 0000(二进制)表示指数位是1。
底数位:我们用23位来存储底数,1110 1000 0000 0000 0000 000(二进制),考虑到每个数转换为科学计数法之后每个数第一位必是1,所以我们从第二位开始存储,1101 0000 0000 0000 0000 000。
索引最终的结果就是
0 1000 0000 1101 0000 0000 0000 0000 000
自我测试
我们以1.0F-0.42F来举例子说明浮点数的运算规则
1.0F(单精度)=1(二进制)=1*2^0(二进制)
指数位是0:在8位二进制的是指数位,0+127代表0,127(10进制)=0111 1111(二进制)
0 0111 1111 0000 0000 0000 0000 0000 000
0.42F(单精度)=0. 0110 1011 1000 0101 0001 1110 1=1.1010 1110 0001 0100 0111 101*2^-2
指数位是-2:在8位二进制的是指数位,127代表0,127-2=125代表-2
125(10进制)=0111 1101(二进制)
0 0111 1101 1010 1110 0001 0100 0111 101
3.4:精度损失
精度由尾数位数决定。
float:2^23 = 8388608
double:2^52 = 4503599627370496
由此可见,float尾数为7位,double尾数为16位。因此,float的精度为6到7位有效数字,
double的精度为15到16位有效数字。
1.1(10进制)=1.0001100110011001100110011001100110011001100110011001101*2^0(二进制)
在浮点类型中尾数部分分别能存储23位和51位,势必要截取掉多余的位数,就会导致精度损失。在运算的时候难以得到我们需要值。
4:double类型详解
跟float大同小异,理解float就能理解double。
float、double精度范围
float、double的精度与范围:
float的范围为-2^128 ~ +2^128(-3.40e+38 ~ +3.40e+38)
有效位数:7
double的范围为-2^1024 ~ +2^1024(-1.79e+308 ~ +1.79e+308)
有效位数:16
float: 尾数+数符 24位 阶码+阶符8位
double : 尾数+数符53位 阶码+阶符11位