2.3 浮点数的表示和运算
定点数一般用于表示纯小数或纯整数,但在很多实际的应用中,计算机处理的数据是小数与整数的混合体。当然,对应这样的数也可以通过一个比例因子将其转换为定点数,但这样无疑是增加了操作的难度,因此在遇到这种情况时,一般都不采用定点数来进行表示及处理,而是采用浮点数来进行表示和处理。
2.3.1 浮点数的表示
让小数点的位置根据需要而浮动,这就是浮点数,浮点数的表示形式如下。
N=M×rE
其中r是浮点数阶码的底,与尾数的基数相同,通常r=2。E和M都是带符号的定点数,E叫做阶码,M叫做尾数。在大多数计算机中,尾数为纯小数,常用原码或补码表示;阶码为纯整数,常用移码表示。
移码的定义如下:设E为阶码,所取移码位数为n,则[E]移=2n-1+E(2n-1为偏置常数)。移码具有以下特征。
(1)假定–2n-1E2n-1-1,则0[E]移2n-1,即移码表示总是大于等于0。因而可将移码看成无符号数。
(2)移码0的真值为–2n–1。即[–2n–1]移=00…0。
(3)0的移码表示是唯一的。即[+0]移=[–0]移=2n–1=10…0。
(4)若将移码第一位看成是符号位,则移码和补码仅符号位不同。
浮点数的一般格式如图2-13所示,浮点数的底是隐含的,在整个机器数中不出现。阶码的符号位为es,阶码的大小反映了在数N中小数点的实际位置;尾数的符号位为ms,它也是整个浮点数的符号位,表示了该浮点数的正、负。
1.浮点数的表示范围
浮点数的大小由阶码部分决定,而其精度由尾数部分决定,如图2-13所示的浮点数,其表示的范围可描述如下。
(1)当es=0,ms=0,阶码和尾数的数值位各位全为1(即阶码和尾数都为最大正数)时,该浮点数为最大正数。
(2)当es=1,ms=0,尾数的最低位mn=1,其余各位为0(即阶码为绝对值最大的负数,尾数为最小正数)时,该浮点数为最小正数。
(3)当es=0,ms=1,阶码的数值位全为1,尾数的数值位全为0(即阶码为最大正数,尾数为绝对值最大的负数)时,该浮点数为绝对值最大负数。
2.浮点数规格化
为了提高运算的精度,需要充分地利用尾数的有效数位,通常采取浮点数规格化形式,即规定尾数的最高数位必须是一个有效值。
一个浮点数的表示形式并不是唯一的。例如,二进制数0.0001101可以表示为0.001101×2-01、0.01101×2-10、0.1101×2-11等,而其中只有0.1101×2-11是规格化数,这就如同十进制实数中的科学标识法一样。规格化浮点数尾数M的绝对值应在下列范围内。
如果r=2,则有在尾数用原码表示时,规格化浮点数的尾数的最高数位总等于1。在尾数用补码表示时,规格化浮点数应满足尾数最高数位与符号位不同(ms⊕m1=1),即当时,应有0.1xx…x形式;当 时,应有1.0xx…x形式。
当M=-1/2时,对于原码来说,这是一个规格化数,而对于补码来说,这不是一个规格化数;当M= -1时,对于原码来说,这将无法表示;而对于补码来说,这是一个规格化数。
当es=1,ms=0,尾数的最高位m1=1,其余各位为0时,浮点数为规格化的最小正数。
规格化的最小正数大于非规格化的最小正数。
非规格化浮点数需要进行规格化操作才能变成规格化浮点数。所谓规格化操作就是通过调整一个非规格化浮点数的尾数和阶码的大小,使非零的浮点数在尾数的最高数位上保证是一个有效值。
如表2-9所示列出了浮点数的几个典型值,设阶码和尾数均用补码表示,阶码共k+1位(含1位阶符),尾数共n+1位(含1位尾符)。
当运算结果大于最大正数时称为正上溢,小于绝对值最大负数时称为负上溢,正上溢和负上溢统一称为上溢,数据一旦产生上溢,计算机必须中止运算操作,进行溢出处理。当运算结果在0至规格化最小正数之间称为正下溢,在0至规格化的绝对值最小负数之间称为负下溢,正下溢和负下溢统一称为下溢,数据一旦出现下溢,计算机一般不做任何处理,仅仅置成机器0即可。
表2-9 浮点数的典型值
浮点数代码 |
真 值 |
||
阶 码 |
尾 数 |
||
最大正数 | 01…1 | 0.11…11 | |
绝对值最大负数 | 01…1 | 1.00…00 | |
最小正数 | 10…0 | 0.00…01 | |
规格化的最小正数 | 10…0 | 0.10…00 | |
绝对值最小负数 | 10…0 | 1.11…11 | |
规格化的绝对值最小负数 | 10…0 | 1.01…11 |
只要浮点数的尾数为0,不论阶码为何值,一般也当做机器0处理。为了保证浮点数0表示形式的唯一性,规定了机器0的标准格式,即尾数为0,阶码为最小值(绝对值最大的负数)。
3.IEEE 754标准
被广泛采用的浮点数编码标准是IEEE754标准。在这个标准中,提供了32位单精度浮点数(短浮点数)和64位双精度浮点数(长浮点数)两种格式,如图2-14所示。另外,还提供了单、双精度两种格式的扩展形式。
单精度格式:1位符号,8位阶码,23位尾数。
双精度格式:1位符号,11位阶码,52位尾数。
在上述格式中,基数隐含为2;阶码用移码表示,偏置常数并不是通常n位移码所用的2n-1,而是2n-1-1,即分别为127和1023;尾数用原码表示,利用基数为2的规格化数中的尾数第一位总为1的特点,在尾数中默认了第一位的1,因而单精度格式的23位尾数实际上表示了24位有效数字。双精度格式的52位尾数实际上表示了53位有效数字。
2.3 点数的表示和运算
评论列表 人参与