实型变量

1.实型数据在内存中的存放形式

实型数据一般占4个字节(32位)内存空间。按指数形式存储。实数3.14159在内存中的存放形式如下:

+

.314159

+

1

          数符           小数部分                        指符        指数

小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。

指数部分占的位数愈多,则能表示的数值范围愈大。

实际上,小数部分是一个二进制纯小数,指数部分以补码存放。

2.实型变量的分类

实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)三类。

在Turbo C中单精度型占4个字节(32位)内存空间,其中数符1位,小数部分23位,指符1位,指数7位,所以其数值范围为3.4E-38~3.4E+38,只能提供6~7位有效数字。双精度型占8 个字节(64位)内存空间,其中数符1位,小数部分23位,指符1位,指数10位,其数值范围为1.7E-308~1.7E+308,可提供15~16位有效数字。

表2.2

类型说明符

比特数(字节数)

有效数字

数的范围

Float

32(4)

6~7

10-37~1038         

Double

64(8)

15~16

10-307~10308

long double

128(16)

18~19

10-4931~104932

3.实型变量的定义形式及初始化与整型相同。

类型说明符:float(单精度实型), double(双精度实型)。 

例如:

float x=1.27 , y=3.5 4;        /*x,y为单精度实型变量,且初值为:1.27和3.54*/

double a,b,c;    /* a,b,c为双精度实型变量*/

在计算机中,存放浮点数一般采用定点数和浮点数两种表示方法。C语言中采用的是浮点数表示法,以Turbo C中的float型的7.8125×10-2为例,其数据存储的格式如下

0

10100000000000000000000

1

0000011

数符        小数部分(23位)                指符   指数(7位)

即二进制的0.101×10-11,转化为十进制为0.625×2-3,即7.8125×10-2。

       对于double型的数据小数部占53位(包括数符一位),指数部分占11位(包括指符一位)。

       对于long double型的数据小数部分占113位(包括数符一位),指数部分占15位(包括指符一位)。

4.实型数据的舍入误差

实型变量也是由有限的存储单元组成的,能提供的有效数字是有限的。这样就会存在舍入误差。看一个例子:

【例2.8】一个较大实数加一个较小实数。

main()

{

float x=7.24356E10, y;

            y=x+54;

printf("x=%e\n",x);

printf("y=%e\n",y);

}

程序执行的结果为:

x=7.24356E10

y=7.24356E10

这里x和y的值都是7.24356E10,显然是有问题的,原因是由于float只能保留6~7位有效数字,变量y所加的54被舍弃。因此由于舍入误差的原因,进行计算时,要避免一个较大实数和一个较小实数相加减。

5.实型数据的溢出

【例2.9】

main()

{

             float a,b,c,d;

a=1.2E33;

b=0.5E-22;

c=0.25E-21;

d=a/b;

d=d*c;

            printf("c=%f\n ",d);

      }

结果会出现

Floating point error: Overflow

这是由于程序中a/b的运算的结果超出了float型能表示的范围产生溢出。所以在使用中应避免直接用一个较大的数除以一个较小的数。可以将程序的计算部分d=a/b; d=d*c; 改为:

d=a*c; d=d/b; 或 d=a/b*c;

以避免这种情况的发生。也许有人会提出d=a/b*c为什么不产生溢出哪?其原因是,在Turbo C中float型数据在计算时要先转换为double型数据,计算后再转换为float型数据赋给float变量d。

2.4.3实训 使用实型数据

实训目的:正确书写实型常量,合理选择实型变量存放数据

实训内容

1、已知三角形的底为2.8cm,高为4.3cm,求三角型的面积。

编程如下:

main()

{float d=2.8,h=4.3, s;

s=d*h/2;

printf(“s=%f”,s);

}

程序运行的结果为:

s=6.020000

     2、将摄氏温度27.5度转换为华氏温度。转换公式为

编程如下:

main()

{

float f=27.5,c;

c=5.0/9*(f-32);

printf(“c=%f”,c);

}

程序运行的结果为:

c=-2.500000

3、上机验证1.0/7*7的结果是否为1.0。为什么?