(三十八)浮点类型
2015-12-03 16:15
267 查看
浮点类型分为三种,分别为:float、double和long double。
这些类型是按照他们可以表示的有效数位和允许的指数最小范围来描述的。
有效数位指:数字中有意义的位(这种说法很别扭,但结合实例就很容易理解),具体而言,12345有5个有效位,12300的却只有2个有效位,12045有5个有效位,12040有4个有效位。
总的而言呢,数字中从第一个非0数字开始算起,到最后一个非0数字为止,这两个边线和中间的数字,都属于有效数位。至于中间有没有小数点,并不重要。例如12345和1.2345的有效数位是一样的。
其中,根据C和C++的有效位数要求,float至少为32位,double至少为48位,且不少于float,而long double至少和double一样多。这三个类型,是有一样多的可能的,但通常来说,float为32位,double为64位,而long double为80、96或者128位。
另外,这三种类型的指数范围,至少为-37~37。可以从头文件cfloat或float.h中找到系统的限制(cfloat是float.h文件的C++版本)
上代码,显示float和double的精度不同:
代码说明:
cout会删除末尾的0,例如3.300 00他只显示3.3。
cout.setf()覆盖了这种行为,因此他可以显示更多的0,至于为什么cout.setf(ios_base::fixed, ios_base::floatfield);限定可以显示6位小数,倒不太清楚。
然后,float的精度为何低,是因为系统确保float至少有6个有效位,却保证了double至少有15个有效位,所以float在6位内是精确的,double在13位也是精确的。因此当小数位数增多后,double的精度便显的更高。
浮点数的优缺点:
优点:可以表示小数、表示的范围更大。
缺点:精度相对较低、运算速度慢。
浮点数的常量书写方法:
float的后缀加f或者F,long double的后缀加l或者L(最好是L),默认情况下,大部分是double类型,例如4.0或者3.1e3
主要用途:例如在计算的时候使用,
例如:
他们的计算结果是不同的。
这些类型是按照他们可以表示的有效数位和允许的指数最小范围来描述的。
有效数位指:数字中有意义的位(这种说法很别扭,但结合实例就很容易理解),具体而言,12345有5个有效位,12300的却只有2个有效位,12045有5个有效位,12040有4个有效位。
总的而言呢,数字中从第一个非0数字开始算起,到最后一个非0数字为止,这两个边线和中间的数字,都属于有效数位。至于中间有没有小数点,并不重要。例如12345和1.2345的有效数位是一样的。
其中,根据C和C++的有效位数要求,float至少为32位,double至少为48位,且不少于float,而long double至少和double一样多。这三个类型,是有一样多的可能的,但通常来说,float为32位,double为64位,而long double为80、96或者128位。
另外,这三种类型的指数范围,至少为-37~37。可以从头文件cfloat或float.h中找到系统的限制(cfloat是float.h文件的C++版本)
上代码,显示float和double的精度不同:
#include<iostream> int main() { using namespace std; cout.setf(ios_base::fixed, ios_base::floatfield); //fixed-point(看不懂)可能是限定显示为6位 float a = 10.0 / 3.0; //变量a为10除以3,且变量a的浮点类型为float double b = 10.0 / 3.0; //变量b同a,只不过浮点类型为double const float million = 1.0e6; //限定常量million=10的6次方 cout << "a= " << a << endl; //先显示a的值,是小数,为3.333 333 cout << "a乘以10的6次方= " << a*million << endl; //显示a的值乘以10的6次方,输出3 333 333.250 000 cout << "然后a乘以10的7次方= " << a * 10 * million << endl; //显示a的值乘以10的7次方,输出33 333 332.000 000 cout << endl; cout << "b= " << b << endl; //输出为3.333 333 cout << "b乘以10的6次方= " << b*million << endl; //输出为3 333 333.333 333 cout << "然后b乘以10的7次方= " << b * 10 * million << endl; //输出为33 333 333.333 333 //可以发现,double b的精度远高于float a,其中float a在乘以10的6次方后,小数点后已经不够精确了,而double b在乘以10的7次方后,小数点后依然精确。 system("Pause"); return 0; }
代码说明:
cout会删除末尾的0,例如3.300 00他只显示3.3。
cout.setf()覆盖了这种行为,因此他可以显示更多的0,至于为什么cout.setf(ios_base::fixed, ios_base::floatfield);限定可以显示6位小数,倒不太清楚。
然后,float的精度为何低,是因为系统确保float至少有6个有效位,却保证了double至少有15个有效位,所以float在6位内是精确的,double在13位也是精确的。因此当小数位数增多后,double的精度便显的更高。
浮点数的优缺点:
优点:可以表示小数、表示的范围更大。
缺点:精度相对较低、运算速度慢。
浮点数的常量书写方法:
float的后缀加f或者F,long double的后缀加l或者L(最好是L),默认情况下,大部分是double类型,例如4.0或者3.1e3
主要用途:例如在计算的时候使用,
例如:
cout.setf(ios_base::fixed, ios_base::floatfield); cout << (7.0f/6)*100000 << endl;和
cout.setf(ios_base::fixed, ios_base::floatfield); cout << (7.0/6)*100000 << endl;
他们的计算结果是不同的。
相关文章推荐
- (三十七)浮点数
- muduo源码分析:数值原子类封装和gcc提供的原子性操作
- 14.10.1 Overview of Online DDL
- OpenCV基本数据格式
- 搭建ionic开发IDE利器-Brackets
- pods的使用
- 【Java基础】Java IO流的总结
- c++读写文件
- 获取鼠标点击时的节点值
- Mac中安装maven3.2.1
- Android开发视频教从入门到精通
- cocos2d-x getVisibleSize , getVisibleOrigin 和坐标位置日记
- group by
- Spark 处理中文乱码问题(UTF-8编码)
- 在Eclipse中创建Maven多模块工程的例子
- Windows上访问虚拟机上的docker容器
- KeyMob移动广告平台在做什么准备呢?
- UML --类图中的关系详解
- mac显示隐藏文件
- C 字符串反转