在C语言中,实数又称浮点数。
按照数值的取值范围不同分为以下3种。
单精度实型:类型声明符为float,在内存中占4字节。
双精度实型:类型声明符为double,在内存中占8字节。
长双精度实型:类型声明符为long double,不同编译系统处理方法不同,Turbo C 2.0和Dev-C++中给long double型分配16字节,Visual C++ 6.0中给其分配8字节。
各种实型变量的数据长度、精度和取值范围与所选择的系统有关,不同系统有所差异。表2.2中列出各种实型变量的数据长度、精度和取值范围。
表2.2 实型变量的数据长度、精度和取值范围
实型变量声明的格式和书写规则与整型的相同。
例如:
float x, y; /* x、y 为单精度变量*/ double a, b, c; /* a、b、c 为双精度变量*/
也可在声明变量为实型的同时,给变量赋初值。
例如:
float x=3.2, y=5.3; /* x、y 为单精度变量,且有初值 */ double a=0.2, b=1.3, c=5.1; /* a、b、c 为双精度变量,且有初值*/
实型数据的存储方式与整型的存储方式不同,实型数据是按照指数形式存储的,系统把实型数据分成小数和指数两个部分分别存放。例如,实数3.14159在内存中的存放形式如图2.6所示。
图2.6 3.14159的存放形式
其中小数部分和指数部分各占多少位,由C编译系统自定。在Turbo C系统中,float类型的变量占4字节32位,24位表示小数部分(最高位是小数部分的符号),8位表示指数部分(最高位是指数部分的符号)。小数部分占的位数越多,数的有效数字越多,精度越高;指数部分占的位数越多,表示的数值范围越大。
在C语言中,实数只采用十进制表示。
实型常量的表示形式有两种:十进制数形式和指数形式。
(1)十进制数形式
该类实型常量由数码0~9和小数点组成。例如,0.0、.25、5.789、0.13、5.0、300.、-267.8230等均为合法的实数。
(2)指数形式
该类实型常量一般格式是“实数+e(或E)+整数”,记为 a e n ,其值为 a ×10 n 。注意字母e之前必须有数字,并且e后面必须是整数,如e2、2.1e3.5、.e3、e等都是不合法的指数形式。123.456的指数形式有123.456e0、1.23456e2、0.123456e3等多种写法,但1.23456e2是规范化的指数形式,即在字母e之前的小数部分中小数点左边有且仅有一位非零的数字。
许多C编译系统将实型常量作为双精度来处理,例如:
float a; a=1.23456*6543.21;
系统将1.23456*6543.21按双精度存储和运算,得到一个双精度的结果,然后取前7位赋值给变量a。这样做可以保证计算结果更精确,但降低了运算的速度。为了提高速度,可以改为:a=1.23456f*6543.21f;,这样系统就会将1.23456*6543.21按单精度存储和运算。
一个实型常量可以赋予一个float型、double型或long double型变量,系统根据变量的类型自动截取相应的有效数字。
下面的例子说明了float和double的不同。
例2.6 演示float和double的区别。
程序代码如下:
#include <stdio.h> int main(){ float a; double b; a=33333.333333; b=33333.333333333; printf("a=%f\nb=%f\n", a, b); return 0; }
说明:
程序运行结果:
a=33333.332031
b=33333.333333
本例中,由于a是单精度浮点型,有效位数只有7位,而整数已占5位,故小数二位之后均为无效数字。b是双精度型,有效位为16位,但Dev-C++规定小数点后最多保留6位,所以其余小数部分四舍五入。