c++ primer 学习之路 (8)3.3 浮点数 书写浮点数 浮点类型(float,double,long double) 浮点常量

3.3 浮点数


使用浮点类型可以表示诸如2.5、3.14159和122442.32这样的数字,即带小数部分的数字。计算机将这样的值分成两部分存储。一部分表示值,另一部分用于对值进行放大或缩小。下面打个比方。对于数字34.1245和34124.5,它们除了小数点的位置不同外,其他都是相同的。可以把第一个数表示为0.341245(基准值)和100(缩放因子),而将第二个数表示为0.341245(基准值相同)和10000(缩放因子更大)。缩放因子的作用是移动小数点的位置,术语浮点因此而得名。

C++内部表示浮点数的方法与此相同,只不过它基于的是二进制数,因此缩放因子是2的幂,不是10的幂。

3.3.1 书写浮点数

第一种是使用常用的标准小数点表示法:

12.34

8.0
第二种表示浮点值的方法叫做E表示法:

3.45E6,这指的是3.45与1000000相乘的结果;E6指的是10的6次方,即1后面6个0。因此,3.45E6表示的是3450000,6被称为指数,3.45被称为尾数,数字中不能有空格,因此7.2 E6是非法的。指数为负数意味着除以10的乘方,而不是乘以10的乘方。因此,8.33E~4表示8.33/104 ,即0.000833。


d.dddE+n指的是将小数点向右移n位,而d.dddE~n指的是将小数点向左移n位。之所以称为“浮点”,就是因为小数点可移动。

3.3.2 浮点类型

C++也有3种浮点类型:float、double和long double。这些类型是按它们可以表示的有效数位和允许的指数最小范围来描述的。

有效位:

例如,加利福尼亚的Shasta山脉的高度为14179英尺,该数字使用了5个有效位,指出了最接近的英尺数。然而,将Shasta山脉的高度写成约14000英尺时,有效位数为2位,因为结果经过四舍五入精确到了千位。在这种情况下,其余的3位只不过是占位符而已。有效位数不依赖于小数点的位置。例如,可以将高度写成14.162千英尺。这样仍有5个有效位,因为这个值精确到了第5位。

float为32位

double为64位

long double为80、96或128位

#include<iostream>
#include<climits>
using namespace std;
int main()
{
 cout.setf(ios_base::fixed, ios_base::floatfield);
 float tub = 10.0 / 3.0;
 double mint = 10.0 / 3.0;
 const float million = 1.0e6;
 cout << "tub = " << tub << endl;
 cout << "a million tubs =" << million*tub << endl;
 cout << "ten millon tubs = " << 10 * tub*million << endl;
 cout << "mint = " << mint << " and a million mint = " << million*mint << endl;
 system("pause");
 return 0;
}

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

ios_base::fixed是设置cout为定点输出格式
ios_base::floatfield是设置输出时按浮点格式,小数点后有6位数字

通常cout会删除结尾的零。例如,将3333333.250000显示为3333333.25。调用cout.setf( )将覆盖这种行为,至少在新的实现中是这样的。这里要注意的是,为何float的精度比double低。tub和mint都被初始化为10.0/3.0—3.333333333333333333……由于cout打印6位小数,因此tub和mint都是精确的。但当程序将每个数乘以一百万后,tub在第7个3之后就与正确的值有了误差。tub在7位有效位上还是精确的(该系统确保float至少有6位有效位,但这是最糟糕的情况)。然而,double类型的变量显示了13个3,因此它至少有13位是精确的。由于系统确保15位有效位,因此这就没有什么好奇怪的了。另外,将tub乘以一百万,再乘以10后,得到的结果不正确,这再一次指出了float的精度限制。

3.3.3 浮点常量

在默认情况下,像8.24和2.4E8这样的浮点常量都属于double类型。如果希望常量为float类型,请使用f或F后缀。对于long double类型,可使用l或L后缀(由于l看起来像数字1,因此L是更好的选择)。



猜你喜欢

转载自blog.csdn.net/zhangfengfanglzb/article/details/80504809
今日推荐