数值型数据的表示(3.0)

定点数和浮点数

实际使用的数值可能既有整数部分也有小数部分。如果有整数部分也有小数部分,那么小数部分的位置该如何表示?计算机在处理数值数据时,对小数点的处理有两种不同的方法,分别是定点法和浮点法,也就是对应了定点数据表示法和浮点数据表示法这两种不同形式的数据表示法。

1.定点数

所谓定点数,就是小数点的位置固定不变的数。为了运算方便,小数点的位置通常有2种约定方式:定点整数——纯整数,小数点在最低的有效数值位之后;定点小数——纯小数,小数点在最高有效数值位之前。

(1)定点整数。定点整数约定机器数的小数点在最低位的右边,实际上就是没有小数位。然后,根据是否带有符号位,定点数还可以分为2类:带符号定点整数和无符号的定点整数。两者的区别在于:带符号的定点整数的最高位为符号位,而无符号定点整数不需设置符号位,所有位都是数值位,只能表示0或整数,所有各数位都用来表示数值大小。

为了减法运算方便,降低CPU的复杂程度,在计算机中带符号的定点整数常用补码表示。设机器字长为n位,则不同表示方式的取值范围有所不同:

补码表示的有符号定点整数的取值范围:-2^n-1~2^n-1  -1

原码表示的有符号定点整数的取值范围:-(2^n-1  -1)~2^n-1  -1

无符号定点整数的取值范围:0~2^n  -1

【例】设机器字长为16位,那么能表示的有符号整数的取值范围是多少?无符号整数的取值范围是多少?

首先有符号整数,如果采用原码表示,取值范围为:

-(2^15  -1)~2^15  -1,即

-32767~+32767

如果采用补码表示法,取值范围为:

-(2^15)~2^15  -1,即

-32768~+32767

无符号整数的取值范围为:

0~2^16  -1,即

0~65535

(2)定点小数。定点小数的机器数一般最高位为符号位,从第2位开始是数值位。小数点一般约定在符号位之后,即机器数的最高位之后,第2位之前。

与定点整数同理,为了减法运算方便,降低CPU复杂程度,在计算机中定点小数常用补码表示。设机器字长为n位,则不同表示方式的取值范围有所不同:

补码表示的定点小数的取值范围:-1~(1-2^-n+1)

原码表示的定点小数的取值范围:-(1-2^-n+1)~(1-2^-n+1)

此外,定点小数还有分辨率的概念,即定点小数所能表示的最小的值。机器字长为n位的定点小数分辨率为2^-n+1.当一个小数的绝对值小于定点小数的分辨率时,这个数当机器数0处理。

【例】设机器字长为16位,那么能表示的定点小数的取值范围是多少?

如果采用原码表示,取值范围为:

-(1-2^-15)~(1-2^-15)

如果采用补码表示,取值范围为:

-1~(1-2^-15)

下面是机器字长为n时,原码、反码、补码的定点数所表示的范围。

机器字长为n时表示的带符号的范围
码制 定点整数 定点小数
原码 -(2^n-1  -1)~+(2^n-1  -1) -(1-2^-n+1)~+(1-2^-n+1)
反码 -(2^n-1  -1)~+(2^n-1  -1) -(1-2^-n+1)~+(1-2^-n+1)
补码 -2^n-1~+(2^n-1  -1) -1~+(1-2^-n+1)

定点数的优点在于运算实现容易,硬件结构简单。但是定点数也存在一些问题:首先,定点数所能表示的数据范围很小。由于小数点位置是固定的,在有限的字长下,定点数所能表示的数据范围较窄。比如上边的例子中,机器字长为16位的定点整数的取值范围为-32768~+32767,而实际应用中,需要运算的数据范围可能要大得多。其次,定点小数的使用有很大局限,运算精度不高。因为实际参加运算的数据很少是纯小数或纯整数,一般都是既有整数部分也有小数部分的实数。使用定点运算的计算机(称为定点机)进行数据运算时,必须先选择一个适当的比例因数,将参加运算的数据转化为定点小数或定点整数再进行计算,然后将运算结果根据所选比例因数转换为真正的结果。

可见,虽然定点运算实现容易,硬件结构简单,但在实际应用中,由于实际使用的数据范围很大,也导致比例因数的选择困难,运算效率不高,限制很多,不适合高精度科学运算和快速运算的要求。因此引入了浮点表示法。

2.浮点数

浮点数即小数点位置可以浮动的数。实际应用中,往往会使用到很多实数,例如下面一些十进制的实数:

13.432=1.3432*10^1

0.0123=1.23*10^-2

1234567000=1.234567*10^9

这些实数既有整数部分也有小数部分,不能用定点数的方式来表示。并且根据上面我们对定点数的分析,定点数所能表示的数值范围比较小,容易溢出。

上面的几个实数例子都采用了科学计数法的方式来计数,可以很方便的表示绝对值很大或很小的数,也可以很方便的表示既有小数部分也有整数部分的实数。而实际上,在计算机中,浮点数的表示就是采用的科学计数法的方式。基于科学计数法的这些优点,我们才引入了浮点数。浮点数是小数点位置不固定的数,他能表示更大范围的数。

二进制数N的浮点数表示方法为

N=2^E×F

其中,E称为解码,F称为尾数。

在浮点表示法中,一个浮点数的存储空间被分为以下几个部分。

阶符|阶码|数符|尾数

其中,阶码E是整数,阶符代表阶码的正负,阶符和阶码合起来反映浮点数的表示范围及小数点的实际位置;尾数F是小数,其位数反映了浮点数的精度;数符代表了浮点数的正负。

浮点数的表示不是唯一的。当小数点的位置改变时,阶码也随之相应改变,因为可以用多种浮点形式表示同一个数。例如,圆周率3.1415926可以表示以下几种形式:

3.1415926=0.31415926*10^1

                    31.415926*10^-1

                   314.15926*10^-2

………………………………

浮点数所能表示的数值范围主要由阶码决定,表示数值的精度则由尾数决定。为了充分利用尾数来表示更多的有效数字,通常对浮点数进行规格化。规格化就是将尾数的绝对值限定在区间[0.5,1].当尾数用补码表示时,需要注意:

若尾数F>=0,则其规格化的尾数,则其规格化的尾数形式为:F=0.1********……******,其中*可为0,也可为1,即将尾数F的范围限定在区间[0.5,1]内。

若尾数F<0,则其规格化的尾数形式为:F=1.0**********…………***,其中*可为0,也可为1,即将尾数F的范围限定在区间[-1,-0.5)内。

计算机中的浮点数一般都会采用规格化的表示方法,目的有两个:①为了提高运算精度,保留更多的有效数字。②保证了浮点数表示的唯一性。

【例】设浮点数字长为16位,其中阶码4位,阶符1位,尾数10位,数符1位。阶码和尾数都用原码表示。将二进制X=0.0001101写成二进制浮点数,并写出其机器数的形式。

浮点数规格化表示为

X=0.1110100000*2^-11(注意,指数-11是二进制数)

机器数形式中:

阶符为:1

阶码为:0011

数符为:0

尾数为:1110100000

3.IEEE754标准

为便于软件的移植,浮点数的表示格式应该有同一标准(定义)。1985年,国际组织电气和电子工程师协会(Institute of Electrical and Electronics,IEEE)提出了IEEE754标准,该标准规定数符表示浮点数的正负,但与尾数是分开的。阶码用移码表示。尾数用原码表示,根据原码的规格化方法,最高数字位总是1,该标准将这个1缺省存储,使得尾数表示范围比实际存储的多一位。实数的IEEE754标准格式如下

数符|阶码(含阶符)|尾数

根据标准定义,常用的浮点数具体有3种形式,分别为短实数(Float)、长实数(Double)和临时实数,区别在于浮点数编码各部分分配大小不同

3中形式浮点数比较
  符号位(bit) 阶码长度(bit) 尾数(bit) 总位数(bit)
短实数(Float) 1 8 23 32
长实数(Double) 1 11 52 64
临时实数 1 15 64 80

二进制实数10110010.001的短实数机器数的表示如下所示:

0 10000110(移码) 01100100010000000000000

解释:

二进制数:10110010.001

则二进制浮点表示为:1.0110010001*2^111

短实数表示:总位数为32位,包含1位符号位,8位阶码(含1位阶符),23位尾数

则:符号位为0

阶码:偏移量为7FH(127),即1111111,则便宜后的阶码为00000111+01111111=10000110

尾数:01100100010000000000000

结果: 0    10000110    01100100010000000000000

猜你喜欢

转载自blog.csdn.net/mez_Blog/article/details/102749365