C++ Primer Plus P48 程序清单3.8(演示float和double类型以及它们表示数字时在精度方面的差异(即有效数位))——中职

C++ Primer Plus P48 程序清单3.8
演示float和double类型以及它们表示数字时在精度方面的差异(即有效数位)

注意:float和double类型默认系统的小数位为6位,且精确的位数从整数第一个数开始算起

/*
C++ Primer Plus P48 程序清单3.8
演示float和double类型以及它们表示数字时在精度方面的差异(即有效数位)

注意:float和double类型默认系统的小数位为6位,且精确的位数从整数第一个数开始算起
*/

//头文件
#include<iostream>

//主函数
int main(void)
{
    
    
	using namespace std;										//编译指令
	cout.setf(ios_base::fixed, ios_base::floatfield);			//用于强制规定浮点类型的变量输出时为定点表示法(即强制不使用e标识符(科学计数法))

	float tub = 10.0 / 3.0;										//初始tub为单精度float类型的无限循环小数
	double mint = 10.0 / 3.0;									//初始tub为双精度double类型的无限循环小数
	const float million = 1.0e+6;								//定义常变量million为e指数法的形式
/*使用单精度float来表示*/
	cout << "使用单精度float来表示" << endl << endl;			//显示界限
	cout << "tub = " << tub << endl;							//输出正常形式的单精度浮点数(有效位6位)
	cout << "million = " << million << endl;					//发现用常变量定义e指数法输出的结果为定点表示法
	cout << "a million tubs = " << million * tub << endl;		//发现结果的精度不对劲了,原因是因为float的有效精度是6位
	cout << "ten million tubs = " << 10 * million * tub << endl;//发现结果位数越大结果的精度越来越差,原因是因为float的有效精度是6位
/*使用双精度double来表示*/
	cout << endl << "使用双精度double来表示" << endl << endl;					//显示界限
	cout << "mint = " << mint << endl;							//结果精度正确
	cout << "a million mints = " << million * mint << endl;		//结果进度正确,双精度double的有效位为15位

	return 0;
}

注意:cout.setf()函数,用于强制规定浮点类型的变量输出时为定点表示法(即强制不使用e标识符(科学计数法))——在第17章会讲解,这里需要知道是干嘛的

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

这里可以看到,const float million = 1.0e+6;定义常变量million为e指数法的形式,在默认情况下,编译器会选择最优的表示法,即若是位数多将会自动选择e表示法,位数少会选择定点表示法。因为开头强制规定了使用定点表示法,为测试功能,这里特地用常变量定义million为e表示法。

	const float million = 1.0e+6;	

这里为输出,million的指令

	cout << "million = " << million << endl;

输出million查看结果发现
在这里插入图片描述
其结果变为了定点表示法

总结:float有效位为6位(最坏情况),本程序第7位也是精确的。double有效位为15位。需要注意精度的问题

本程序出现了一段代码,在第17章详细说明,希望嫩早日理解
cout.setf(ios_base::fixed, ios_base::floatfield);

感谢观看

再次感谢~

猜你喜欢

转载自blog.csdn.net/qq_51212951/article/details/113316283