浮点数能够表示带小数部分的数字,如M1油箱的汽油里程数(0.56MPG),它们提供的值范围也更大。如果数字很大,无法表示为 kng 类型,如人体的细菌数(估计超过100兆),则可以使用浮点类型来表示。
使用浮点类型可以表示诸如2.5、3.14159和122442.32这样的数字,即带小数部分的数字。计算机将这样的值分成两部分存储。一部分表示值,另一部分用于对值进行放大或缩小。下面打个比方。对于数字34.1245和34124.5,它们除了小数点的位置不同外,其他都是相同的。可以把第一个数表示为0.341245(基准值)和100(缩放因子),而将第二个数表示为0.341245(基准值相同)和10000(缩放因子更大)。缩放因子的作用是移动小数点的位置,术语浮点因此而得名。C++内部表示浮点数的方法与此相同,只不过它基于的是二进制数,因此缩放因子是2的幂,不是10的幂。幸运的是,程序员不必详细了解内部表示。重要的是,浮点数能够表示小数值、非常大和非常小的值,它们的内部表示方法与整数有天填之别。
如何书写浮点数?
C++有两种书写浮点数的方式。
第一种是使用常用的标准小数点表示法:
// floating-point
12.34
// floating-point
939001.32
// floating-point
0.00023
// still floating-point
8.0
即使小数部分为0(如8.0),小数点也将确保该数字以浮点格式(而不是整数格式)表示。(C++标准允许实现表示不同的区域;例如,提供了使用欧洲方法的机制,即将逗号而不是句点用作小数点。然而,这些选项控制的是数字在输入和输出中的外观,而不是数字在代码中的外观。)
第二种表示浮点值的方法叫做E表示法,其外观是像这样的:3.45E6,这指的是3.45与100000相乘的结果;E6指的是10的6次方,即1后面6个0。因此,3.45E6表示的是3450000,6被称为指数,3.45 被称为尾数。下面是一些例子:
// can use E or e, + is optional
2.52e+8
// exponent can be negative
8.33E-4
// same as 7.0E+05
7E5
// can have + or - sign in front
-18.32e13
// 2010 Brazilian public debt in reais
1.69e12
// mass of earth in kilograms
5.98E24
// mass of an electron in kilograms
9.1le-31
读者可能注意到了,E表示法最适合于非常大和非常小的数。
E 表示法确保数字以浮点格式存储,即使没有小数点。注意,既可以使用E也可以使用e,指数可以是正数也可以是负数。然而,数字中不能有空格,因此7.2 E6是非法的。
指数为负数意味着除以10的乘方,而不是乘以10的乘方。因此,8.33E~4表示8.33/10²,即0.000833。同样,电子质量9.1le~31 kg表示 0.000000000000000000000000000911 kg。注意,-8.33E4指的是-83300。前面的符号用于数值,而指数的符号用于缩放。
记住:d.dddE+n指的是将小数点向右移n位,而d.dddE~n指的是将小数点向左移n位。之所以称为“浮点”,就是因为小数点可移动。
浮点数的优缺点
与整数相比,浮点数有两大优点。首先,它们可以表示整数之间的值。其次,由于有缩放因子,它们可以表示的范围大得多。另一方面,浮点运算的速度通常比整数运算慢,且精度将降低。
例如下面程序:
#include <iostream>
int main(){
using namespace std;
float a=2.34E+22f;
float b= a+1.0f;
cout << "a= "<< a << endl;
cout << "b-a="<< b-a << endl;
return 0;
}
该程序将数字加1,然后减去原来的数字。结果应该为1。下面是在某个系统上运行时该程序的输出:
a=2.34e+022
b-a=0
问题在于,2.34E+22是一个小数点左边有23位的数字。加上1,就是在第23位加1。但float类型只能表示数字中的前.6位或前7位,因此修改第23位对这个值不会有任何影响。