C++的浮点数类型

创作内容不易,学习的朋友麻烦关注下博主,后面学习不迷路。有不会的问题也可以论坛咨询博主,博主也会及时回复~~

目录

1.基本概念

二.浮点数类型有效位数

三.声明与使用

四.浮点数优缺点

浮点数在数据类型上一共就两个,一个是float,另一个是double。但两个唯一的区别就在于double精度方面是float的两倍

1.基本概念

首先介绍浮点数的三种书写形式

第一种 书写浮点数 :10364.0(%f)

第二种 科学计数法: 1.0364×104(没有)

第三种 指数计数法: 1.0364e4(%e)

而浮点数分为两部分存储,一部分表示值,另一部分用于对值进行放大或缩小。值部分我们称为尾数。而放大多小部分就是指数,它们其实就是移动小数点的位置(这也是浮点数名称的由来)

1.0364e4。1.0364叫尾数,e4,4就是指数,它可以把小数点往右移动4位(乘以10000)

指数部分也可以为负1.0364e-4,这就把小数点往左移动4位(除以10000)

二.浮点数类型有效位数

在C标准中规定,float必须能表示六位数字(不是小数点6位数字,包括小数点前面的),double至少能表示15位有效数字。这里有效位指的是数字中右意义的位,比如1.001有4个有效位。而1.000只有1个有效位,因为后面的0没有也不会有啥影响

Float:占32位,其中8位用于表示指数的值和符号,剩下24位用来表示非指数部分(我们也称位尾数或有小数)

Double:占64位,这32位多出来的一般都用于表示非指数部分

Long dougle:满足比double类型更高的精度要求。不过,C只能保证long double类型至少和double类型的进度一致。

三.声明与使用

#include <iostream>

#include <climits>        //为了使用SHRT_MAX



int main()

{

    using namespace std;

    float a = 10.0 / 3.0 * 1000000;



    cout.setf(ios_base::fixed, ios_base::floatfield);

    cout << a << endl;

    cout << a * 1.3 << endl;

    cout << a * 1.3f << endl;

    cout << a * 1.3L << endl;



    return 0;

}

首先我们先声明了float a,这里需要知道,默认情况下浮点数计算都是以double进行的

像我们这种情况,浮点数常量会默认以double类型存储,又因为强制类型转换,会自动把同表达式其他数自动转换为该表达式值中类型字节最大的那个数,所以整个表达式以double类型进行计算,然后在截取成float类型给到a

cout.setf(ios_base::fixed, ios_base::floatfield);是让系统在浮点数有效位数比较多的时候任然用书写浮点数打印。去掉效果如下

这样不利于我们观察结果

接着我们看

cout << a * 1.3 << endl;

cout << a * 1.3f << endl;

cout << a * 1.3L << endl;

每次a都是乘以1.3,但不同的是1.3后面有的啥也没跟,但有的跟着是f,有的则是L,这些都叫后缀,它的作用是将书写浮点数以对应后缀存放,f就是float,L就是long double。如果不加,1.3就会默认以double类型存储

如图,1.3,1.3L分都是以double和long double存储,也都是都是8字节,而1.3f就是float

这样,在表达式计算的过程,

a * 1.3 因为有double类型,所以会自动强制转换位double计算

a * 1.3f,因为都是float类型,所以以float计算

a * 1.3L,因为有long doulbe类型,所以自动强制转换为long double计算。

看到结果,我们也可以明显发现float计算的精度是明显低的。

四.浮点数优缺点

浮点有两个优点

1.它可以用来表示整数之间的值

2.由于有缩放因子,它们可以表示的范围大得多,所以在用整数也表达不了得情况下可以选择使用浮点数

#include <iostream>

#include <climits>        //为了使用SHRT_MAX



int main()

{

    using namespace std;

    unsigned long long int a = ULLONG_MAX;

    float b = a;



    cout << a << endl;

    a = a + 1;

    b = b + 1;
    
    cout << a << endl;

    cout << b << endl;

    return 0;

}

这个例子我们取了系统中能表示得最大整数,然后在这个基础上加1,结果得0,然后如果我们把这个值赋给一个浮点数,加1,则可以继续加

ULLONG_MAX表示unsigned long long int类型所能表示的最大值

而缺点就是,浮点数运算速度通常都比整数慢,且精度会降低,我们在来看一个例子

#include <iostream>

#include <climits>        //为了使用SHRT_MAX



int main()

{

    using namespace std;

    float a = 2.34E+22f;

    float b = a + 1.0f;

    cout << a << endl;

    cout << b - a << endl;

    return 0;

}

这个例子疑惑就在于b是在a的基础上加上一个float类型的1.0而得到的。但使用b-a的时候却只得到0值。

这个主要是因为2.34E+22是一个小数点右边有23位的数字,加上1,就是在第23位加1。但float的精度一般只有6或7位,所以修改23位的值其实并没有对float类型有啥改变。



我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小天才哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值