(三十八)浮点类型

浮点类型分为三种,分别为: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的精度不同:


#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;

他们的计算结果是不同的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值