浮点数表示方式总结
王春桃
定点数的表示范围有限,为此需要采用浮点数表示。所谓浮点表示,即先将某一待表示数值写成二进制指数形式,然后在表示时只记录数的指数及尾数部分,这样能在有限的二进制位数情况下表示很大范围内的数值。如对于十进制数值(20.59375)10,写成二进制指数形式为0.1010010011×24,在表示是只记录尾数0.1010010011和指数100即可。
总体而言,浮点数的表示形式主要有一般格式IEEE754格式这两种。其中,一般格式指满足一般的二进制数机器码(包括定点整数和定点小数)的规定规则;而IEEE754格式则在一般格式上进一步做了一些约定,以便表示数时比较方便和高效。下面以32位的浮点数表示作为例子来说明。
1. 浮点表示的一般格式
根据浮点表示的目的可知,浮点数需要在有限长的二进制位数(如32位)内表示尾数和指数。也就是说,在有限位数内需要包含尾数和指数两部分信息,进一步考虑到这两部分都有正负之
分,因此浮点表示的一般格式可以设计为:
图1 浮点表示的一般格式
其中阶码就是指数,阶符就是指数的符号;数符是指尾数的符号。至于它们之间各占多少位,取决于表示范围、表示精度等方面的权衡。如对于32位长的浮点数,阶符和数符各用1位,阶码可以用7位,尾数23位;阶符和阶码也可以结合起来,用一个8位来表达。
图1中,将数符放在中间部分,这与定点表示格式不一致,而且在计算机处理时也不够方便,因此实际中一般采用图2所示的浮点表示格式。
数符
阶码
尾数
图2 实际使用中的浮点表示一般格式
其中,阶符已经包含在阶码中了。例如,对于32位长的浮点数,数符用1位,0表示正数,1
表示负数;阶码用8位,通常用移码表示以方便用硬件实现指数运算,因这时表示范围为正数范围0~255,减去偏移量128得到实际的指数范围为-128~127;尾数为23位,用原码或补码纯小数表示均可。
为了使得浮点数表示的范围尽可能大及表示的效率尽可能高,尾数需要进行规格化。对于一般格式,尾数的规格化规则如下:
A、 尾数为原码时
正数:0.1xxxxx………x
负数:1.1xxxxx………x
B、 尾数为补码时
正数:0.1xxxxx………x
负数:1.0xxxxx………x
其中,最高位表示符号位(0为正数1为负数),小数点后面表示纯小数表示的尾数中属于定点小数的部分。例如,对于0.1010010011×24,尾数(连数符位)用原码和补码表示时均为为0.1010010011,因此尾数部分实际填充的二进制数值是1010010011。而对于-0.1010010011×24,用原码表示时,尾数(连数符位)为1.1010010011,因此数符为1,尾数为1010010011;用补码表示时,尾数(连数符位)为.010*******,因此数符位1,尾数为010*******。上述这两个例子就是规格化表示的具体例子。
2. 浮点表示的IEEE754格式
32位浮点表示的IEEE754格式:
其中,数符位1位,阶码E占8位,尾数M占23个比特。数符位的表示方法与一般格式的相同,0为正数,1为负数;阶码和尾数的表示方法在一般格式的基础上进一步作了一些约定,具体如下。
虽然阶码也是采用移码,但偏移量不再是128,而是127。原因是把阶码为全0和全1这两种特殊情况排除掉了,因而只有1~254才表示真正的阶码,实际的指数值为-126~+127,超过这个范围则属于溢出。
尾数用原码表示。为了进一步提高规格化数表示的效率,将规格化数规定为1.M的形式,即先不考虑符号位,而是通过对尾数进行适当的左移或右移,使得尾数的最高有效位总是出现在小数点的左边(对应一般格式的规格化数,最高有效位则出现在小数点的右边第1位)。这样,由于小数点的左边总是1,因此在表示的时候,我们可以省略掉,只要将1.M中的“M”这些小数值放在IEEE754格式中的、长为23位的“M”中即可。这样的好处是相当于多了一位(即隐含省去的那个1,这个1也称为隐含位)来表示尾数,从而使得尾数的表示效率大大增加。
IEEE754格式的例子见书本,这里不在列出。
3. 一般格式和IEEE754格式的选择问题
小数的原码现实应用的计算机系统中,采用的是IEEE754格式。
做题目的时候,究竟采用一般格式还是IEEE754格式,这个由题给条件来判断。如果题目中没明确声明是IEEE754格式,则采用一般格式,因为这通常是为了考察移码、规格化尾数的相关知识点。在做题的时候,数符如无特别说明都是0为正数1为负数,但对于阶码精品文档,你值得期待
和尾数则一定要看清楚题目的规定,究竟是采用哪种机器码表示。
X