浮点数加减运算,就像十进制科学计数法一样,需要先对齐小数点再进行加减。

整个流程分五步:

  1. 对阶: 两个浮点数的阶码要相同,小的阶码向大的阶码看齐。将小阶码的尾数右移,每移动一位,阶码加1,直到两个阶码相等。
  2. 尾数加减: 阶码对齐后,将两个尾数按照定点数的规则进行加减运算。
  3. 规格化: 尾数加减后,要确保结果符合规格化要求。尾数最高位必须是有效位(如二进制原码的0.1xxx1.1xxx,补码的0.1xxx1.0xxx)。若不符合,需要左移或右移尾数并调整阶码,直到符合规格。
  4. 舍入: 由于尾数位数有限,对阶和规格化过程中可能需要舍去部分位数,这需要使用舍入策略(如0舍1入、截断等)来尽量减少误差。
  5. 溢出判断: 检查阶码是否溢出(上溢或下溢)。

简单来说,就像 的计算:

  1. 对阶: 变为
  2. 尾数加减:
  3. 规格化: 已经规格化
  4. 舍入:如果尾数位数不足,则需要舍入
  5. 溢出判断:检查阶码 是否过大或过小

IEEE754 标准中,尾数采用的是原码表示,而不是补码。阶码采用移码表示。

1. 浮点数的组成

浮点数由三部分组成:符号位、阶码和尾数。

  • 符号位:0 表示正数,1 表示负数。
  • 阶码:是一个整数,用于表示小数点的位置,类似于科学计数法中的指数。在 IEEE 754 中,阶码用移码表示。
  • 尾数:是一个小数,表示浮点数的有效数字。在 IEEE 754 中,尾数用原码表示,并且使用了隐藏位技术。

2. IEEE 754 单精度浮点数格式

IEEE 754 单精度浮点数用 32 位表示,其中:

  • 符号位:1 位
  • 阶码:8 位,用移码表示,偏置值为 127
  • 尾数:23 位,用原码表示,并隐藏了最高位的 1

3. 隐藏位技术

对于规格化的二进制浮点数,尾数的最高位总是 1。为了提高精度,IEEE 754 标准将这个 1 隐藏起来,不显式存储。例如,二进制数 1.011,实际存储的尾数只有 011,因为前面的 1 是默认存在的。这样,23 位尾数实际上可以表示 24 位的有效数字。

4. 阶码的移码表示

阶码用移码表示的目的是为了方便比较浮点数的大小。移码的计算方法是:阶码的真值加上偏置值。对于单精度浮点数,偏置值是 127。

5. 十进制小数转换为二进制小数

将十进制小数转换为二进制小数的方法是:乘 2 取整,直到小数部分为 0 或达到所需的精度。

6. 示例:-0.4375 的 IEEE 754 单精度浮点数表示

  • 将 -0.4375 转换为二进制:-0.0111
  • 规格化:-1.11 x 2
  • 符号位:1 (负数)
  • 阶码:-2 + 127 = 125 = 01111101 (二进制)
  • 尾数:隐藏最高位的 1,剩下的部分是 11,用 0 补齐到 23 位:11000000000000000000000
  • 最终结果:1 01111101 11000000000000000000000 = BEE00000H

接下来,我们将详细讲解阶码、尾数、上溢、下溢、左规、右规等概念。了解这些概念后,我们将继续介绍浮点加减法运算。

首先,我们来看一个熟悉的例子,涉及两个用科学计数法表示的十进制浮点数相加。通过变换,原式可转化为一种形式,表明我们将一个浮点数的表示转换成了另一种形式,即将解码增加3,以便与另一个浮点数的阶码5相同,相应的尾数0.408需要右移三位。这种操作称为对接。不难看出,对接的目的是使两个浮点数的尾数可以直接进行加减运算。

本例进行了加法运算,这是尾数进行加法运算后的结果。我们知道,计算机内部的浮点数在数据表示时,需要对尾数进行规格化处理,也就是使得尾数的最高数值位必须是一个有效值,这样就可使浮点数的表示形式为一,还可以使浮点数的表示精度最高。当进行尾数右归时,位数末位的几位会因超出计算机字长而被丢弃,从而产生误差。此时计算机可以按选定的方式进行舍入处理。另外在进行尾数规格化时,可能是左归,也可能是右归,以及尾数舍入时,可能会对结果的解码执行相应的加减运算。因此必须考虑结果的阶码出现溢出的问题。由于浮点数中阶码的位数决定了浮点数的表示范围,因此对于浮点运算,当阶码出现溢出时,就要表示运算结果出现溢出。

对于那些对舍入、阶码溢出等概念理解尚不清晰的同学,不必担心。我们在此主要目的是为了介绍浮点加减运算的步骤以及可能遇到的溢出问题。接下来,通过两个示例,帮助大家理解浮点加减运算的步骤以及所涉及的溢出问题。首先,请看示例一,暂停视频播放,仔细阅读屏幕上的要求。

好的,我们一起来分析。首先,我们将二进制浮点数X的阶码记为EX,尾数记为MX;Y的阶码和尾数分别记为EY和MY。然后,它们各自的补码形式可以通过定义或扫描法得出。这部分内容是学习第二章后应熟练掌握的基础知识,我们不再赘述。由此,我们可以得出二进制浮点数X的补码形式,它由阶码EX的补码形式和尾数MX的补码形式构成。这部分内容不再详细说明。需要注意的是,本节课介绍的浮点加减法运算中,其操作数并不符合HRE754浮点数标准。因此,希望同学们不要将本课程的内容与HRE754浮点数标准混淆。

本题要求对二进制浮点数X和Y进行加法运算。首先进行对齐,在之前的讲解中,我们采用小阶向大阶看齐的方式,这是已对接的情况。同时,我们还需要将尾数右移相应的位数,因此会有相应的位从尾数第一位移出并被舍弃。这种做法仅产生极小的精度损失。请同学们思考,如果我们采用大阶向小阶看齐的方式,会有什么结果?许多同学可能已经想到了,这会导致尾数左移相应的位数,相应的位从尾数的高位移出并被丢弃,从而造成严重的数值错误。对于移位操作不熟悉的同学,请复习本章中有关算术移位的内容。这样我们就得到了对接的原则,那就是小阶向大阶看齐,尾数右移相应位数,也就是两个阶的差的绝对值。

对于本例中的二进制浮点数X和Y,它们各自的解码采用了双符号补码表示。那么如何判断它们的大小呢?我们可以通过比较它们的阶码,具体做法是计算X的阶码EX的补码减去Y的阶码EY的补码,然后根据结果进行判断,将补码减法转换成补码加法。这需要根据Y的补码求其反码。这是学习第二章后应熟练掌握的基本技能,故不再赘述。但若要具体得知各自的补码,根据补码减法的原理,EX的补码减去EY的补码与EX减去EY然后再求补是等价的。根据补码的定义,或者将补码转换成原码,进而可以得出EX减EY的结果为-3,这就表明X的解码比Y的解码小3,因此X的解码应向Y的解码看齐,相应的需要将X的尾数向右移动三位对接后,二进制浮点数X的阶码EX,其补码就等于二进制浮点数Y的阶码EY的补码。相应的X的尾数MX的补码要算出有余三位。

请同学们注意,从尾数第一位移出的位暂时保留,称为保留附加位。保留附加位参与中间运算以提高运算精度。尾数运算结束后,对结果进行规格化再舍入,这样我们就得到了对接后的结果。

第二步,执行尾数运算,即对二进制浮点数X的尾数MX与二进制浮点数Y的尾数MY进行补码加法运算。这样就得到了经过尾数运算后的新的双符号补码表示的尾数。请同学们思考一下,这是否表示规格化的尾数?答案是否定的,因为补码的最高数值位的值对于其所表示的尾数而言不是有效值,因此其所表示的尾数不是规格化的尾数。具体来说,采用双符号补码表示时,符号位为00表示补码所表示的真值为正数,此时补码的数值位与真值相同。由此可得,本例中补码的最高数值位的值为1,对于其所表示的尾数而言才是有效值,其所表示的尾数才是规格化的尾数。

因此,我们进入了第三步,对尾数运算后得到的新尾数进行规格化。不知同学们是否还记得,浮点数的规格化分为向左规格化和向右规格化,简称为左规和右规。由于采用的是双符号补码,因此当尾数运算后得到的新尾数的双符号补码为这两种形式时,表明新尾数不是规格化的尾数。具体原因,我们刚刚进行过解释,就不再赘述了。这种情况下需要对尾数进行左归,具体方法如下:尾数每左移一位,阶码就相应的减1。上述操作直到尾数成为规格化尾数为止,由于尾数每左移一位,阶码就相应的减1,因此左规完成后还需要判断解码是否下一。

对于采用双符号补码表示的解码,若符号位为10,则表示发生了下溢,此时可认为浮点运算的最终结果为机器0。若尾数运算后得到的新尾数的双符号补码为这两种形式时,表明新尾数溢出,这在定点加减运算中是不允许的。然而,在浮点加减运算中,这并不意味着浮点运算的最终结果一定会溢出。通过右规可以处理这种溢出,具体方法是仅需将尾数右移一位,并相应地增加解码值。由于解码过程中进行了加1操作,因此在完成右规后还需要判断是否发生了上溢。

对于采用双符号补码表示的解码过程,当结果的符号位为01时,表明发生了上溢。这意味着,浮点运算的最终结果被认为是无穷大。对于那些对上溢和下溢的概念感到陌生的同学,请复习教材第二章中关于浮点数表示形式和表示范围的相关内容。对于本例,我们需要对尾数运算后得到的新尾数进行左规一化处理,以便使其成为规格化尾数。同时,需要将新尾数的双符号补码算术左移两位。这是左规一化后的结果,可以看到,有两位的保留附加位被直接移入了数值位。这正是我们之前对接时所介绍的,利用保留附加位可以提高运算精度。

由于我们对尾数运算后得到的新尾数进行了左归,相应的我们需要将阶码减2来得到新的阶码。对于本例,也就是用已对接的二进制浮点数X的阶码EX的双符号不或者是二进制浮点数外的阶码意外的双负二不,加上负二的不,带入各自具体的不骂得到结果。我们知道当阶码采用双辐尔伯马表示时,符号位为01表示上意,符号位为10表示下意,因此本例没有溢出。这样我们就得到了新尾数规格化后的双符号补码,以及相应阶码的双符号补码。

第四步是舍入处理。经过前几步的处理,我们发现,在进行浮点数对接时一定会用到算术右移,而在进行结果规格化时也可能会用到算术右移。算术右移会导致尾数末尾的几位因超出机器字长而被丢掉,从而产生误差。针对这种情况,机器可以选择三种方式进行舍入处理:截断法就是直接丢弃超出机器字长的尾数低位,这种方法会导致误差积累。末位恒置一法就是将机器字长内的尾数的最低位恒置为一,这种方法会损失一位精度,但误差积累较小。类似十进制的四舍五入法的舍入方式,即当需要丢弃的尾数低位中的最高位为一时,将机器字长内的尾数的最低位加1。这种方法的误差最小,但操作较复杂,还可能导致舍入处理后的尾数变成非规格化数,需要重新进行规格化。

在本例中,当进行算术右移时,该位置的数值被丢弃。这是根据我们之前介绍的三种舍入处理方法得出的结果。现在,我们已经得到了舍入处理的结果。再次提醒同学们注意,采用“零舍一入”的舍入处理规则,若破坏了规格化结果,则需要重新进行规格化处理。

至此,我们完成了本地要求的双符号补码法对二进制浮点数X和Y进行加法运算。我们得出X加Y的双符号补码,它由阶码的双符号补码和尾数的双符号补码两部分组成。这是在尾数运算结果规格化后得到的阶码的双符号补码。若采用零舍一入法进行舍入处理,则这是最终得到的二进制浮点数X和Y的加法运算结果的双符号补码表示形式。可写出其相应的真值表示形式,我们在此不再赘述。

请同学们暂停视频播放,仔细阅读本例的说明。好的,我们共同分析。首先,将例子中给出的浮点数的十进制形式转换为二进制形式。对于阶码的转换,相信各位同学能够掌握,但尾数的转换可能让一些同学感到困惑。以浮点数X为例,25可采用凑十法转换为相应的二进制形式,而32视为2的5次方。因此,25除以32可理解为将25的二进制形式的小数点向左移动五位。这样,我们就能写出X和Y各自的阶码和尾数的二进制形式,进而确定各自的双符号补码,并按照浮点加减法运算的步骤进行处理。希望同学们能够参照例一,自行完成此例,这里不再赘述,仅给出各步骤的处理内容和结果,这是第一步对接的处理内容和结果。

这是第二步尾数运算的处理内容和结果。这是第三步位数运算结果规则化的处理内容和结果。可以发现,本例中出现了阶码上亿的情况,这会导致运算结果溢出,因此运算结束可认为运算结果为无穷大,系统会产生溢出中断。与利益相比,本例的主要区别在于两个方面:一是进行了浮点减法运算,当然了采用补码表示可转换成加法运算;二是出现了阶码溢出的情况,导致运算结果溢出。