目录
1:float类型和double类型的定义
2:二者的范围和精度
3:float类型详解
3.1:整数位10进制转换为2进制
3.2:小数位10进制转换为2进制
3.3:把二进制放到浮点类型中
3.4:精度损失
4:double类型详解
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的二进制
符号位:0
指数位:用8位来存储指数,范围是0-255(10进制),0-126代表负数,127代表0,128-255代表正数,再结合余127码,他应该存储1+127(10进制)即1000 0000(二进制)。
底数位:我们用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进制)=1111111(二进制)
0 0111 1111 0000 0000 0000 0000 0000 000
0.42F(单精度)=0.0110101110000101000111101=1.10101110000101000111101*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(进制)=1.0001100110011001100110011001100110011001100110011001101*2^0(二进制)
在浮点类型中尾数部分分别能存储23位和51位,势必要截取掉多余的位数,就会导致精度损失。在运算的时候难以得到我们需要值。
4:double类型详解
跟float大同小异,理解float就能理解double。