使用浮点类型可以表示带小数部分的数字,计算机将这样的值分为两部分存储,一部分表示值,一部分对值进行放大或缩小,比如3.1415926和31.415926 处了小数点位置不一样,其他都一样,可以将值表示为0.31415926 缩放因子为10 31.415926 缩放因子为100 只不过计算机存放缩放因子是二进制 因此是2的次幂 不是10
浮点的书写方式
- 小数点
- E表示法 3.45E6 = 3.45* 10^6 6被成为指数 3.45被称为尾数 这里要区分负尾数 和 负指数 负指数表示乘以10^(-x)相当于除以10^x e n表示小数点向右移动n位 E~n表示小数点向左移动n位 浮点的有效位
该系统保证float有6位的有效位 保证double有15位的有效位。什么是有效位?我们前面谁说过浮点数据存储时是指数和小数分开存储的。比如 3.1415926在内存中是 0..31415926 10^1 算六个有效位 而本系统float有效位是6位 也就是最多精确到float的6位 超出6位后面的精确性未知
代码语言:javascript复制#include<iostream>
using namespace std;
int main()
{
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
<< endl
<< "mint = " << mint
<< endl;
//因为cout在这里输出的是六位 float可以保证六位浮点数的准确度
//如果我们把这个结果的有效位扩大,可以看看准确度是否会改变
cout << "a million tubs = " << tub*million
<< endl
<< "a million mints = " << mint * million;
//可以看到tubs在第七位之后就出现了误差,该系统确保float至少有6位的有效位
//而double的结果扩大million也没有出现误差,因为他至少保证15位有效位
}
如果我们在代码中没有加入 cout.setf(ios_base::fixed, ios_base::floatfield);//规范显示 则显示的结果会是会是E表示法 对我们判断有效位毫无意义 所以我们一定要在浮点类型的有效位中对数据进行操作,如果超出有效位进行修改,那么修改是无意义甚至是错误的。
浮点常量
默认情况下,程序把类似8.24 2.4E8这样的浮点存储为浮点型,如果希望是float类型,则用float后缀(f或F)
优点
与整数相比 浮点可以表示整数之间的值 其次因为有缩放因子 他们可以表示的范围很大 缺点是浮点的计算速度比整数慢且精度会降低
代码语言:javascript复制#include<iostream>
using namespace std;
int main()
{
float a = 2.34E22f;
float b = a 1.0f;
cout << "a = " << a << endl;
cout << "b -a = " << b - a << endl;
}
结果应该是1,但是因为精度问题,只能保证至少六位,22位float无法保证,所以是0.