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);
感谢观看
再次感谢~