2. 浮点型
C 标准规定的浮点型有 float 、 double 、 long double ,和整型一样,既没有规定每种类型占多少字节,也没有规定采用哪种表示形式。浮点数的实现在各种平台上差异很大,有的处理器有浮点运算单元(FPU,Floating Point Unit),称为硬浮点(Hard-float)实现;有的处理器没有浮点运算单元,只能做整数运算,需要用整数运算来模拟浮点运算,称为软浮点(Soft-float)实现。大部分平台的浮点数实现遵循 IEEE 754, float 型通常是 32 位, double 型通常是 64 位。
long double 型通常是比double 型精度更高的类型,但各平台的实现有较大差异。在 x86 平台上,大多数编译器实现的long double 型是 80 位,因为 x86 的浮点运算单元具有 80 位精度,gcc 实现的long double 型是 12 字节(96 位),这是为了对齐到 4 字节边界(在第 4 节 “结构体和联合体”详细讨论对齐的问题),也有些编译器实现的long double 型和double 型精度相同,没有充分利用 x86 浮点运算单元的精度。其它体系结构的浮点运算单元的精度不同,编译器实现也会不同,例如 PowerPC 上的long double 型通常是 128 位。
以前我们只用到最简单的浮点数常量,例如 3.14,现在看看浮点数常量还有哪些写法。由于浮点数在计算机中的表示是基于科学计数法的,所以浮点数常量也可以写成科学计数法的形式,尾数和指数之间用 e 或 E 隔开,例如 314e-2 表示 314×10-2,注意这种表示形式基数是 101,如果尾数的小数点左边或右边没有数字则表示这一部分为零,例如 3.e-1,.987 等等。浮点数也可以加一个后缀,例如 3.14f、.01L,浮点数的后缀和类型之间的对应关系比较简单,没有后缀的浮点数常量是 double 型的,有后缀 f 或 F 的浮点数常量是 float 型的,有后缀 l 或 L 的浮点数常量是 long double 型的。
-
C99 引入一种新的十六进制浮点数表示,基数是 2,本书不做详细介绍。 ↩