浮点数

2023-10-11 21:16:57 浏览数 (1)

使用浮点类型可以表示带小数部分的数字,计算机将这样的值分为两部分存储,一部分表示值,一部分对值进行放大或缩小,比如3.1415926和31.415926 处了小数点位置不一样,其他都一样,可以将值表示为0.31415926 缩放因子为10 31.415926 缩放因子为100 只不过计算机存放缩放因子是二进制 因此是2的次幂 不是10

浮点的书写方式

  1. 小数点
  2. 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.

0 人点赞