新编C语言程序设计教程(第2版)
上QQ阅读APP看书,第一时间看更新

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型处理。