第二节 数的定点表示和浮点表示
在计算机中,小数点不用专门的器件表示,而是按约定的方式标出。共有两种方法来表示小数点的存在,即定点表示和浮点表示。定点表示的数称为定点数,浮点表示的数称为浮点数。
一、定点表示
小数点固定在某一位置的数为定点数,有以下两种格式。
当小数点位于数符和第一数值位之间时,机器内的数为纯小数;当小数点位于数值位之后时,机器内的数为纯整数。采用定点数的机器叫做定点机。数值部分的位数n决定了定点机中数的表示范围。若机器数采用原码,小数定点机中数的表示范围是-(1-2-n)~(1-2-n),整数定点机中数的表示范围是-(2n-1)~(2n-1)。
在定点机中,由于小数点的位置固定不变,故当机器处理的数不是纯小数或纯整数时,必须乘上一个比例因子,否则会产生“溢出”。
二、浮点表示
实际上计算机中处理的数不一定是纯小数或纯整数(如圆周率3.1416),而且有些数据的数值范围相差很大(电子的质量9×10-28克,太阳的质量2×1033克),它们都不能直接用定点小数或定点整数表示,但均可用浮点数表示。浮点数即小数点的位置可以浮动的数,如
352.47=3.5247×102
=3524.7×10-1
=0.35247×103
显然,这里小数点的位置是变化的,但因为分别乘上了不同的10的方幂,故值不变。
通常,浮点数被表示成
N=S×rj
式中S为尾数(可正可负),j为阶码(可正可负),r是基数(或基值)。在计算机中,基数可取2、4、8或16等。
以基数r=2为例,数N可写成下列不同形式:
N=11.0101
=0.110101×210
=1.10101×21
=1101.01×2-10
=0.00110101×2100
为了提高数据精度以及便于浮点数的比较,在计算机中规定浮点数的尾数用纯小数形式,故上例中0.110101×210和0.00110101×2100形式是可以采用的。此外,将尾数最高位为1的浮点数称作规格化数,即0.110101×210为浮点数的规格化形式。浮点数表示成规格化形式后,其精度最高。
1.浮点数的表示形式
浮点数在机器中的形式如下所示。采用这种数据格式的机器叫做浮点机。
可见浮点数由阶码j和尾数S两部分组成。阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位置;尾数是小数,其位数n反映了浮点数的精度;尾数的符号Sf代表浮点数的正负。
2.浮点数的表示范围
以通式N= S×rj为例,设浮点数阶码的数值位取m位,尾数的数值位取n位,当浮点数为非规格化数时,它在数轴上的表示范围如下所示。
由图可见,其最大正数为
;最小正数为
;最大负数为
;最小负数为
。当浮点数阶码大于最大阶码时,称为“上溢”,此时机器停止运算,进行中断溢出处理;当浮点数阶码小于最小阶码时,称为“下溢”,此时“溢出”的数绝对值很小,通常将尾数各位强置为零,按机器零处理,此时机器可以继续运行。
一旦浮点数的位数确定后,合理分配阶码和尾数的位数,直接影响浮点数的表示范围和精度。通常对于短实数(总位数为32位),阶码取8位(含阶符1位),尾数取24位(含数符1位);对于长实数(总位数为64位),阶码取11位(含阶符1位),尾数取53位(含数符1位);对于临时实数(总位数为80),阶码取15位(含阶符1位),尾数取65位(含数符1位)。
3.浮点数的规格化
为了提高浮点数的精度,其尾数必须为规格化数。如果不是规格化数,就要通过修改阶码并同时左右移尾数的办法,使其变成规格化数。将非规格化数转换成规格化数的过程叫做规格化。对于基数不同的浮点数,因其规格化数的形式不同,规格化过程也不同。
当基数为2时,尾数最高位为1的数为规格化数。规格化时,尾数左移一位,阶码减1,(这种规格化叫做向左规格化,简称左规);尾数右移一位,阶码加1(这种规格化叫做向右规格化,简称右规)。浮点数规格化后,其最大正数为
;最小正数为
;最大负数为
;最小负数为
。
当基数为4时,尾数的最高两位不全为零的数为规格化数。规格化时,尾数左移两位,阶码减1;尾数右移两位,阶码加1。
当基数为8时,尾数的最高三位不全为零的数为规格化数。规格化时,尾数左移三位,阶码减1;尾数右移三位,阶码加1。
同理类推,不难得到基数为16或2n时的规格化过程。
浮点机中一旦基数确定启就不再变了,而且基数是隐含的,故不同基数的浮点数其表示形式完全相同。但基数不同,对数的表示范围和精度等都受影响。一般来说,基数r越大,可表示的浮点数范围越宽,而且所表示的数其个数越多。但r越大,浮点数的精度反而下降。如r=16的浮点数,因其规格化数的尾数最高三位可能出现零,故与其尾舞位数相同的r=2的浮点数相比,后者可能比俞者多三位精度。
三、定点数和浮点数的比较
定点数和浮点数可从如下几个方面进行比较:
(1)当浮点机和定点机中的数其位数相同时,浮点数的表示范围比定点数大得多。
(2)当浮点数为规格化数财,其精度远比定点数高。
(3)浮点数运算要分阶码部分和尾数部分,而且运算结果都要求规格化,故浮点运算步骤比定点运算步骤多,运算速度比定点低,运算线路比定点复杂。
(4)在溢出的判断方法上,浮点数是对规格化数的阶码进行判断,而定点数是对数值本身进行判断。如小数定点机中的数其绝对值必须小于1,否则即“溢出”,此时要求机器停止运算,进行处理。为了防止溢出,上机前必须选择比例因子,这个工作比较麻烦,给编程带来不便。而浮点数的表示范围远比定点数大,仅当“上溢”时机器才停止运算,故一般不必考虑比例因子的选择。
总之,浮点数在数的表示范围、数的精度、溢出处理和程序编程方面(不取比例因子)均优于定点数。但在运算规则、运算速度及硬件成本方面又不如定点数。因此,究竟选用定点数还是浮点数,应根据具体应用综合考虑。一般来说,通用的大型计算机大多采用浮点数,或同时采用定、浮点数;小型、微型及某些专用机、控制机则大多采用定点数。当需要作浮点运算时,可通过软件实现,也可外加浮点扩展硬件(如协处理器)来实现。
四、举例
例:将十进制数+13/128写成二进制定点数和浮点数(数值部分取10位,阶码部分取4位,阶符和数符各取1位),分别写出它在定点机和浮点机中的机器数形式。
解:令x=+13/128
其二进制形式:x=0.0001101000
定点数形式:x=0.0001101000
浮点数规格化表示:x=0.1101000000×2-11
定点机中 [x]原=[x]补=[x]反=0.0001101000
浮点机中 [x]原:1,0011;0.1101000000
[x]补:1,1101;0.1101000000
五、IEEE754标准
在IEE754浮点数标准中,定义的浮点数的格式如下表所示。其中浮点数编码有32位、64位和80位三种格式,分别称为短实数、长实数和临时实数,短实数和长实数又分别称为单精度数和双精度数。
浮点数
符号位
阶码
尾数
总位数
短实数
长实数
临时实数
1
1
1
8
11
25
23
52
64
32
64
80
在IEE754浮点数标准中,符号位s仍然用0表示正数,用1表示负数。正常数的阶码取值e的范围为1~254,尾数部分可以取任意的二进制数值f。这样,单精度数所表示的数值为:
从中我们可以发现,IEEE 754标准将一般规格化数中位于小数点后的1移到了小数点前,而且不需要用编码表示,只是在数值转换时在公式中加上这个1。另外,阶码代表的值需要减去127,而不是128,这也与一般移码略有不同。IEEE
754双精度数的阶码取值范围为1~2046,代码所表示的数值为:
例:将十进制数-0.75表示成单精度的IEEE 754标准代码。
解:-0.75可表示成-3/4。即二进制的-0.11。在浮点表示法中为
-0.11×20
在IEEE 754标准中规格化数的表示法为
-1.1×2-1
根据IEE754的单精度表示公式
这个数可表示为
(-1)1×(1+0.1000 0000 0000 0000 0000 000)×2-1
=(-1)1×(1+0.1000 0000 0000 0000 0000 000)×2126-127
即
l 01111110 10000000000000000000000
例:将如下IEEE 754单精度浮点数用十进制数表示:
1 1000000l 010000000000000000000000
解:符号位s=1,阶码部分值e=129,尾数部分f=1/4=0.25,根据IEEE754标准的表示公式
(-1)1×(1+0.25)×2129-127
=-l×1.25×22
=-1.25×4
=-5.0