C也支持特殊的数字类型,计算中使用的标准浮点类型(实数)如下所列:
l Folat
定义单精度变量
l Double
定义双精度变量
l Long double
定义扩展精度变量
一个浮点值能被以有限的精度存储,这取决于表示它的二进制格式和存储它使用的内存的大小,精度以有效数的个数来表示,例如”精度为6个小数位”或”6位精度”的意思是此类型的二进制表示足够精确,可以存储一个具有6个小数位的实数。小数点的位置没有关系,并且小数据点前后的0不计算在这6个数中,数值123,456,000和0.00123456都可存储在一个6位精度的类型中。
在C中,浮点型运算在内部被当做double或更高的精度类型处理,例如,下面的计算使用double类型。
float height = 1.2345, width = 2.3456; // Float variables have single // precision. double area = height * width; // The actual calculation is // performed with double // (or greater) precision.
如果将结果赋值给一个float型变量,它的值会被四舍五入,关于数据中的浮点型讨论,可参见15章的math.h。
关于浮点型的存储大小和二进制格式,C仅定义了最小的要求,但是,通常使用的格式是IEC在1989年标准中定义的,通过查看宏__STDC_IEC_559__,可以判断C编译器是否支持IEC的浮点型标准。Table 2-6中列举了IEC60599中浮点型实数的取值范围和精度,使用十进法表示。
Table 2-6. Real floating-point type
|
|||||
Type |
Storage size |
Value range |
Smallest positive value |
Precision |
|
float |
4 bytes |
±3.4E+38 |
1.2E-38 |
6 digits |
|
double |
8 bytes |
±1.7E+308 |
2.3E-308 |
15 digits |
|
long double |
10 bytes |
±1.1E+4932 |
3.4E-4932 |
19 digits |
|
头文件float.h定义的宏允许你在程序中使用这些值或其他细节来表示实数的二进制表示。FLT_MIN, FLT_MAX和FLT_DIG指出float 类型的取值范围和精度,相应地,double和long double类型的宏以DBL_和LDBL_为前缀。这类的宏及浮点数的二进制表示将在第15章的float.h中描述。
Example 2-2中的程序开始打印float型的一些典型值,接着,描述了将一个浮点数存放在float类型变量中四舍五入引起的错误。
Example 2-2. Illustrating the precision of type float
#include <stdio.h> #include <float.h> int main( ) { puts("/nCharacteristics of the type float/n"); printf("Storage size: %d bytes/n" "Smallest positive value: %E/n" "Greatest positive value: %E/n" "Precision: %d decimal digits/n", sizeof(float), FLT_MIN, FLT_MAX, FLT_DIG); puts("/nAn example of float precision:/n"); double d_var = 12345.6; // A variable of type double. float f_var = (float)d_var; // Initializes the float // variable with the value of d_var. printf("The floating-point number " "%18.10f/n", d_var); printf("has been stored in a variable/n" "of type float as the value " "%18.10f/n", f_var); printf("The rounding error is " "%18.10f/n", d_var - f_var); return 0; }
程序的最后一部分将输出以下内容:
The floating-point number 12345.6000000000 has been stored in a variable of type float as the value 12345.5996093750 The rounding error is 0.0003906250
在本例中,离十进制12,345.6最近的数为12,345.5996093750,这看起来不像是一个十进法的四舍五入,但在内部浮点型的二进制表示中,它的确是,而12,345.60则不是。