7 认识变量数据类型—float和double
7.1 认识float和double
float 呢,就像是一个小小的数字盒子,可以装下一些比较小的数字。它能表示小数哦,就像我们在做数学题时用到的小数一样。而 double 呢,它是一个更大的数字盒子,可以装下更多更大的数字呢。它比 float 能表示的数字范围更广,也能更精确地表示小数。比如说,如果我们要计算非常非常小或者非常非常大的数字,就可以用 double 来保证准确性哦。
float 和 double 在很多程序中都很有用呢,比如做游戏、画画、计算数学问题等等。
7.2 float和double定义及初始化
-
使用浮点数据类型关键字float 和 双精度浮点数据类型关键字double
float 变量名 例如 float height;
double 变量名 例如 double area;
-
变量的初始化
float 和 double 变量的初始化与int是一样的。你可以定义为
float height=1.73 , double weight=2.35
也可以不给变量赋值,例如
float height; double weight;
不给变量赋值的时候,系统也会自动给它随机赋一个值
7.3 float和double的存储
float 和 double 变量存储的都是带小数的数,所以要存储这样的数,依然是分为两步。
-
第一步将10进度制的小数转换为二进度制
例如将3.625转换成二进制数
1)整数部分的处理:3/2=1.....1,其中为余数1;1/2=0.....1,其中为余数1。
那么整数部分就是11
2)小数部分的处理:
将十进制的0.625转换为二进制,可以进行如下计算:
(1)将小数部分0.625乘2,取整数部分1。
(2)用剩余的小数部分0.25乘2,取整数部分0。
(3)将剩余的小数部分0.25乘2,取整数部分0。
(4) 再将转换好的二进度制数存储到空间里
(5)最后,把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后 取的整数作为低位有效位,得到二进制数0.101。
3) 最终把整数和小数部分合在一起,就是11.101
-
第二步 把这个数值存起来,那么如何存呢?
1)首先要将二进制转换成整数位只有1位同时是1的值
例如:11.101=1.1101*2^1
0.001101=1.101*2^(-3)
2) 将转换后的二进制数分三个区域来存它。
float 的存储区:
double的存储区:
sign: 指的是正数和负数,正数指的是大于0的数,负数指的是小于0的数,0代表正数,1代表 负数
exponent:
exponent = n + 偏离值
n是2^n的这个n,比如1.1101*2^1, 那么就是1, 1.101*2^(-3),那么就是-3
float的默认偏离值=127,double的默认偏离值=1023
1) float 如果是2^1,那么就是127+1=128,对应的exponent的值是10000000, 如果 是-3,那么就是127-3=124, 对应的exponent的值是1111100
2)double 的exponent是11bit, 当exponent=1的时候,1023+1=1024,对应的exponent 的值是10000000000,如果是-3,那么就是1023-3=1020,对应的exponent的值是
1111111100
fraction: 这个部分就是1.1101的小数点后面的数,1101,
这个部分float 的大小是23bit , double的大小是52bit
7.4 float和double的存储空间
float 和 double的存储空间,基于上一节所讲的,已经很清楚了,
float 实际上 sign + exponent + fraction = 1+8+23 = 32 bit = 4byte 也就是4字节
double 实际上 sign + exponent + fraction = 1+11+52 = 64 bit = 8byte 也是8字节
7.5 float和double变量可以存其他类型
我们尝试给float变量赋一个整数和一个字母看看会出什么结果。
这个结果与整型一样,赋值一个整数,输出依然是整数,赋值一个字母,输出也依然是整数。
我们再看看double 变量赋一个整数和一个字母看看会出什么结果
这个结果与float一样,赋值一个整数,输出依然是整数,赋值一个字母,输出也依然是整数。
7.6 float 和 double变量的精度
7.6.1 理解变量精度
1) float 存的数少,所以它的精度肯定就差一点,所以叫单精度。单精度范围是-2^128 ~ +2^128,对应的是7个小数位数,当显示小数位数超过7位,7位以后的小数与实际值
是有偏差,所以这就是精度的意义。我们举个例子:
3.1415967896, 小数位数为10位,那么float的情况下,第7位的小数显示的还是对的,第8位
以后的数就会与实际值有偏差。
我们先看看显示完全10位小数的情况:
这个值小数点后第8位开始是794,而实际值是896,是不是不一样了,因为float的精度只能保证到小数点后7位,第8位就不准了。
2)double 存的数多,所以它的精度肯定就好一点,而且是float的精度的两倍,所以叫双精度。
双精度范围是-2^1024 ~ +2^1024,对应的是15个小数位数,当显示小数位数超过15位,15位以后的小数与实际值是有偏差.
7.6.2 变量数值显示
float和double变量存好数值后,我们会发现一个问题,就是输出值的时候小数位数只有4位,见
下面的例子
那么我们想要让它显示更多位怎么办呢?用下面的语句
std::cout << std::setprecision(10); 10就是希望显示的位数
例子:显示7位数字,