3.2const限定符
常量的符号名称,符号名称指出了常量表示的内容。如果程序在多个地方使用同一个常量,则需要修改该常量时,只需要修改一个符号定义即可。
此时我们可以想到一个东西:#define ZERO 0;(旁注“符号常量——预处理器方法”)。
C++有另外一种处理符号常量的方法,const关键字
const type name = value
const int Months = 12
const 是缩写,原词是constant,意为不变的
3.3浮点数
本质:科学表示法
计算机组成原理中的浮点型:
上面的图是内部的浮点数表示,用的是二进制。
3.3.1 书写浮点数
- 平时的小数书写方法 :3.4,0.003 ,0.5
- E表示法
E表示法,就是科学计数法。例如:3.45E6指的是3.45 与 10^6相乘。
指数可以是负数,所以3.45E-5,就是3.45*10^-6
3.3.2 浮点数的类型
- float ,double ,long double
根据黄色的地方看出,三种浮点数类型的有效位:
float:6
double:15
long double: 18
有关cout.setf()的用法,第一原型和第二原型
C++ 中的 cout.setf() 函数_白水的博客-优快云博客_cout.setf()
#include<iostream>
int main() {
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield);
float tub = 10.0 / 3.0;
double mint = 10.0 / 3.0;
const float Million = 1.0E6;
cout << "tub = " << tub;
cout << ",a million tubs = " << Million * tub;
cout << ",\nten million tubs = ";
cout << 10 * Million * tub << endl;
cout << "mint = " << mint;
cout << " and a million mints = " << mint * Million << endl;
return 0;
}
tub = 3.333333,a million tubs = 3333333.250000,
ten million tubs = 33333332.000000
mint = 3.333333 and a million mints = 3333333.333333
float符号位1位,指数位8位,尾数位23位。
如果我们先不考虑,指数位:
能表示的最大的二进制数是2^23-1 1111111 11111111 11111111,因为科学计数法,而且由于二进制的原因,所以小数点前一位,一定是1。所以最大的数其实是2^24-1,11111111 11111111 11111111。
float的指数位是无符号的,它的正负区分通过采用一个偏移值来确定,下表可以查到float单精度的偏移值是127。偏移前表达范围[0,255],经过偏移后,8位指数位所能表达的范围是:[-127,128]。
不过通过查看float.h文件发现,float二进制最大指数是128,最小-125
该图片来自AlbertSfloat的精度和取值范围_AlbertS Home of Technology-优快云博客_float的取值范围
所以最大取值为1.11111111 11111111 1111111(24个一)*2^127
与文件中的 float的符号常量一致。他妈的终于弄懂他这逼玩意范围了
知道范围如何求得以后,就容易知道,为啥精度缺失了。因为尾数位有限,在尾数位+1(科学计数法,二进制小数点前一位,必然是1,不理解可以看十进制的科学计数法。小数点前一位可以是1-9里的任意一个数字,所以二进制,只能是1,尾数位只存储小数点之后的,在这里尾数位加一),也就是24位二进制所表示的最大范围内[0,16777215]。有效位在这个范围内的数(先忽略小数点)都可以被精确表示。我看了很多资料,关于float的精确度,我觉得很晦涩难懂,我想如果借助有效位这个概念,便一目了然了。