3.1.3 定点数与浮点数
计算机中处理的数据大多是带有小数的,小数点在计算机中通常有两种表示方法:一种是约定所有数值的小数点隐含在某一固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。不论是定点数还是浮点数,小数点的位置都是隐含的,不占用内存。
(1)定点数表示法
所谓定点数,即约定计算机中所有数据的小数点的位置都是固定不变的。在计算机中通常采用两种约定形式:将小数点的位置约定在数据的最高位之前,符号位之后,则该数只能表示定点小数;将小数点的位置约定在数据的最低位之后,则该数只能表示定点整数。
定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为
x=x0. x1x2…xn-1
则在计算机中的表示形式为
如果一个二进制小数的位数为n,那么数值部分的位数为n-1,则定点小数的表示范围是
-(1-2-(n-1))≤x≤1-2-(n-1)
定点整数是纯整数,约定小数点在数值部分的最高位之前。若数据x的形式为x=x0.x1x2…xn-1,则在计算机中的表示形式为
如果一个二进制小数的位数为n,那么数值部分的位数为n-1,则定点整数的表示范围是
-(2n-1)≤x≤2n-1-1
当数据小于定点数能表示的最小值时,计算机作0处理,称为下溢;当数据大于定点数能表示的最大值时,计算机将无法表示,称为上溢。上溢和下溢统称为溢出。
计算机采用定点数表示时,对于既有小数又有整数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,得到运算结果后,再根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果溢出,降低运算结果精度。
用定点数进行运算处理的计算机称为定点机。
(2)浮点数表示法
运用科学计数法,任何一个J进制数N,总可以写成
N=M×JE
式中M称为N的尾数,是一个纯小数;E是数N的阶码,是一个整数,J称为底数。这种表示方法相当于数的小数点的位置随阶码的不同而在一定范围内可以自由浮动,所以称为浮点表示法。
由于计算机中使用的都是二进制数,所以浮点数的底数是2,是隐含的。那么在计算机中表示一个浮点数时,就要给出尾数和阶码。尾数用定点小数表示,尾数部分给出有效数字的位数,因而决定了浮点数的精度。阶码用整数表示,阶码给出小数点在数据中的实际位置,因而决定了浮点数的表示范围。浮点数也要有符号位,所以一个浮点数由阶码和尾数及其符号位组成。
其中Es表示阶码的符号,占一位,E1~En为阶码值,占n位,尾符是数N的符号,也要占一位。当底数取2时,二进制数N的小数点每右移一位,阶码减1,相应尾数右移一位;反之,小数点每左移一位,阶码加1,相应尾数左移一位。
若不对浮点数的表示作出明确规定,同一个浮点数的表示就不是唯一的。例如11.01也可以表示成0.01101×2-3,0.1101×2-2等等。为了提高数据的表示精度,当尾数的值不为0时,其绝对值应大于等于0.5,即尾数域的最高有效位应为1,否则要以修改阶码同时左右移小数点的方法,使其变成符合这一要求的表示形式,这称为浮点数的规格化表示。
当一个浮点数的尾数为0时,不论其阶码为何值,或者当阶码的值遇到比它能表示的最小值还小时,计算机都把该浮点数看成0值,称为机器零。
浮点数所表示的范围比定点数大。假设机器中的数由8位二进制数表示(包括符号位):在定点机中这8位全部用来表示有效数字(包括符号);在浮点机中若阶符、阶码占3位,尾符、尾数占5位,在此情况下,若只考虑正数值,定点机小数表示的数的范围是0.0000000到0.1111111,相当于十进制数的0~,而浮点机所能表示的数的范围则是0.0001×2-4到0.1111×23,相当于十进制数的~7.5。显然,都用8位二进制数表示,浮点机能表示的数的范围比定点机大得多。
尽管浮点表示法能扩大数据的表示范围,但浮点机在运算过程中仍会出现溢出现象。下面以阶码占3位,尾数占5位(各包括1位符号位)为例,来讨论这个问题。规格化浮点数的数值表示范围为
“负数区域”和“正数区域”及“0”,是机器可表示的数据区域;上溢区是数据绝对值太大,机器无法表示的区域;下溢区是数据绝对值太小,机器无法表示的区域。若运算结果落在上溢区,就产生了溢出错误,使得结果不能被正确表示,要停止机器运行,进行溢出处理。若运算结果落在下溢区,也不能正确表示,机器作0处理,称为机器零。
一般来说,增加尾数的位数,将增加可表示区域数据点的密度,从而提高了数据的精度;增加阶码的位数,将增大可表示的数据区域。