
3.5 实型数据
实型数据分为实型常量数据与实型变量数据两种。
3.5.1 实型常量
实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有两种形式,即十进制小数形式与指数形式。
1.十进制数小数形式
由符号位(正号可省略)与带小数点的数(数码0~9和小数点组成)构成。
例如,0.0,25.0,5.789,0.13,5.0,+300.,-267.8230等均为合法的实数。注意:必须有小数点。
2.指数形式
由带小数点的十进制数与阶码标志“e”或“E”以及阶码(只能为整数,但可以带符号)组成。其一般形式为:aEn(a为带小数点的十进制数或为整数,n为十进制整数,均带符号),其值为a*10n。下面为合法的实数。

标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数,如356.0f和356.是等价的。
【例3-8】浮点类型数的输出。

运行结果:
3.5.2 实型变量
1.实型变量的分类
实型变量分为单精度(float)、双精度(double)和长双精度(long double)3类。
2.实型数据在内存中的存放形式
实型数据按数据的指数形式存储,在内存中的存放形式如下:

实数无论是单精度还是双精度在存储中都分为3个部分。
1)数符或符号位(s):0代表正,1代表为负。
2)指数部分或指数位(e):用于存储科学计数法中的指数数据,并且采用指数移位存储。n位指数位能表示0~(2n-1),为了能表示负指数,往往采用减去偏移量,如减(2n-1-1)来实现负指数的表示。而存储时则用实际指数值加偏移量如(2n-1-1)来存入指数部分,这就是所谓的指数移位存储。
3)小数部分或尾数部分(f):存放数据科学计数法中的小数数字部分。
指数部分与小数部分的位数因实数占用字节数及C语言编译系统的不同而异,但一般不论是float还是double,在存储方式上都是遵从IEEE(Institute of Electrical and Electronic Engineers,美国电气和电子工程师协会)规范的。
1)float遵从的是IEEE R32.24——指数部分占8位,小数部分占23位,如图3-5a所示。
2)double遵从的是R64.53——指数部分占11位,小数部分占52位,如图3-5b所示。

图3-5 32位单精度与64位双精度实数的存储方式
a) 32位单精度实数的存储方式 b) 64位双精度实数的存储方式
注意:小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。
以单精度数120.5为例,其存储方式说明如图3-6所示。

图3-6 单精度数120.5的二进制存储方式
【例3-9】验证浮点数的存储方式。


运行结果:
【例3-9】及其运行结果表明,(120.5的float二进制指数存储形式)=(010000101111000100 00000000000000)2=(1123090432)10=(10274200000)8=(42F10000)16程序结果验证了实数的二进制指数存储形式。
在Turbo C(或Win-TC)中,单精度型占4个字节(32位)内存空间,其数值范围为-3.4E+38~3.4E+38,只能提供7位有效数字。双精度型占8个字节(64位)内存空间,其数值范围为-1.7E+308~1.7E+308,可提供16位有效数字。不同类型实数存储状况及其特性见表3-2。
表3-2 实数数据存储及其特性

3.实型变量定义
实型变量定义的格式和书写规则与整型相同。举例如下。

4.实型数据的舍入误差
由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。
【例3-10】实型数据的舍入误差。

说明:从运行结果看,误差明显。注意:C语言中1.0/3*3的结果并不精确等于1。
【例3-11】浮点数的有效数位。


运行结果:
说明:由于a是单精度浮点型,有效位数只有7位。而整数已占5位,故小数两位之后均为无效数字。b是双精度型,有效位为16位。
VC++6.0/2010、Turbo C(或Win-TC)都规定,缺省时小数后最多保留6位,其余部分四舍五入。
5.实型常数的类型
C语言规定:实型常数不区分单、双精度,都按双精度double型处理。