运算方法和运算器补充
文章目录
- 零、写在前面
- 一、移位运算
- 1.1 逻辑移位
- 1.2 算术移位
- 1.3 循环移位
- 二、定点数的加法和减法运算
- 2.1 补码加减法运算公式
- 2.2 补码加减法运算的溢出检测
- 2.3 逻辑代数和逻辑门
- 2.4 一位全加器的硬件逻辑实现
- 2.5 串行进位加法器的硬件逻辑实现
- 2.6 先行进位加法器的硬件逻辑实现
- 三、定点数的乘法运算和除法运算
- 3.1 无符号数乘法运算部件的硬件逻辑实现
- 3.2 原位乘法运算部件的硬件逻辑实现
- 3.3 补码乘法运算的硬件逻辑实现
- 3.3.1 Booth 算法
- 3.3.2 补码一位乘法运算(Booth算法)的硬件逻辑实现
- 3.3.3 练习
- 3.3.4 无符号阵列乘法器
- 3.3.5 补码阵列乘法器
- 3.4 定点数的除法运算
- 3.4.1 原码除法运算(恢复余数法)
- 3.4.2 原码除法运算(不恢复余数法)
- 3.4.3 补码除法运算(不恢复余数法)
- 3.5 浮点运算
- 3.5.1 浮点加减法运算(非IEEE754标准)
- 3.5.2 IEEE 754 浮点加减法运算
- 3.5.3 浮点乘法运算
- 3.5.4 浮点除法运算
- 3.6 运算器
零、写在前面
根据 408 计组内容,对 《计算机组成与设计:硬件/软件接口》关于运算方法和运算器部分的补充。
大黑书关于这部分欠缺的挺多的
一、移位运算
1.1 逻辑移位
- 逻辑移位的对象:无符号数
- 逻辑移位的规则:
- 逻辑左移:高位移除,低位补0;
- 逻辑右移:低位移除,高位补0;
1.2 算术移位
- 算术移位的对象:有符号数(针对定点数,包括定点整数和定点小数)
- 不论正数还是负数,符号位保持不变,仅对数值位进行移位(左移或右移)
- 对真值的原码、反码和补码进行算术移位后,它们各自所对应的新的真值应该保持一致
- 当真值为正数时,真值的原码、反码和补码都相同,因此,对它们进行算术移位后,它们各自所对应的新的真值自然是保持一致的。对于移位后出现的空位,规定添补0。左移时,若最高位丢1,则结果出错;右移时,若最低位丢1,则精度缺失。
- 当真值为负数时,真值的原码、反码和补码都不同,因此,对它们进行算术移位后,为了确保我们稍后它们各自所对应的新的真值保持一致,对于移位后出现的空位,添补规则各不相同,推导给出它们各自具体的添补规则。
- 有符号定点数的补码的另一种算术移位方法,即**“符号位也参与移位”**,具体规则如下:
- 左移:高位移除,低位添补0;移动前后若符号位发生变化,则发生溢出
右移:低位移除,高位添补符号
- 左移:高位移除,低位添补0;移动前后若符号位发生变化,则发生溢出
- 上述这种针对有符号定点数的补码的算术移位方法,具有以下优点:
- 左移时,有检测出发生溢出的方法:符号位发生变化可判定溢出
- 符号位与数值位一起移位,方便ALU处理,也方便人们记忆
练习
B
1.3 循环移位
- 循环移位的对象:无符号数
- 将无符号数二进制形式中的各个位向左或向右移动,被移出的位会重新出现在另一端,形成循环
- 在很多处理器架构中,循环移位指令会影响状态寄存器中的进位标志CF(Carry Flag)位,CF标志位用于标识在执行算术或逻辑操作时是否发生了进位。
- 根据CF标志位是否加入循环移位过程,循环移位可分为以下四种:
-
不带CF标志位的循环右移(小循环)
-
不带CF标志位的循环左移(小循环)
-
带CF标志位的循环右移(大循环)
-
带CF标志位的循环左移(大循环)
-
循环移位的应用
- 循环移位的应用主要有:加密算法、哈希函数、优化算法
- 加密算法:通过循环移位可以实现数据的混淆和置换,增强加密算法的安全性
- 哈希函数:通过循环移位可以用来改变输入数据的排列顺序,以产生不同的哈希值,有利于增强哈希函数的混淆性和扩散性。
- 优化算法:在某些算法中,循环移位可以用于优化性能和节省资源。例如,在图形处理和数字信号处理中,循环移位可以用于加速算法的执行。
二、定点数的加法和减法运算
2.1 补码加减法运算公式
- 定点数(定点整数和定点小数)在计算机内部采用补码表示,原因如下:
- 补码的符号位可以与数值位一起参加运算。
- 采用补码可将减法运算转换成加法运算。
- 补码加法和减法运算的公式如下:
2.2 补码加减法运算的溢出检测
-
计算机的字长是有限的,因此所能表示的数据范围也是有限的
-
当运算结果超出所能表示的数据范围时,就会出现溢出(Overflow)
- 溢出会导致错误的运算结果
- 计算机系统设计人员必须要解决溢出的检测问题,以便在发生溢出时计算机能做出相应的处理
-
定点数补码加减运算判断溢出的方法主要有以下3种:
- 方法1:根据操作数的符号位与运算结果的符号位是否一致进行判断
- 方法2:根据运算过程中最高数值位的进位与符号位的进位是否一致进行判断
- 方法3:利用变形补码(具有2位符号位的补码)的符号位进行判断
方法1:根据操作数的符号位与运算结果的符号位是否一致进行判断
- 两个操作数相加时,当它们的符号位相同(即同正或同负)时,才可能发生溢出
- 因此:
- 溢出:运算结果的符号位与原操作数的符号位不同
未溢出:运算结果的符号位与原操作数的符号位相同
- 溢出:运算结果的符号位与原操作数的符号位不同
- 由于采用补码可将减法运算转换成加法运算,因此不论作加法还是减法,只要实际参加运算的两个操作数符号相同,但运算结果的符号位与原操数不同,即为溢出。
方法2:根据运算过程中最高数值位的进位与符号位的进位是否一致进行判断
-
不同可判定为产生溢出,相同可判定为没有产生溢出。
-
正溢和负溢的例子:
-
逻辑表达式表示:
- O F = C n − 1 ⊕ C n OF = C_{n-1} \oplus C_n OF=Cn−1⊕Cn
方法3:利用变形补码(具有2位符号位的补码)的符号位进行判断
- 变形补码也称为双符号补码,具有2个符号位,其余与补码相同。
- 双符号位为 00 时,表示正数
- 双符号位为 11 时,表示负数
- 双符号位为 01 时,表示正溢出
- 双符号位为 10 时,表示负溢出
- 溢出检测的逻辑表达式
- 左起第一个符号位记为Cn+1左起第二个符号位记为Cn,溢出标志位记为OF,当OF为1时表示发生溢出。Cn+1与Cn不同,则产生溢出(即OF为1):$OF = C_{n+1} \oplus C_{n} $
练习
D
1110 1000 + 1101 1000 = 1100 0000,选A
C
C
2.3 逻辑代数和逻辑门
2.4 一位全加器的硬件逻辑实现
符号含义:
逻辑表达式:
组合逻辑电路:
传播延迟分析:
假设基本逻辑门电路的传播延迟为 1T,复合逻辑门电路的传播延迟为 3T
屏蔽内部实现细节用符号表示:
除了一位全加器FA,还有一位半加器HA(Half Adder)。HA没有进位输入C;所以其内部逻辑只有一个异或门(用于产生本位和Si),一个与门(用于产生向高位的进位Ci+1)。
2.5 串行进位加法器的硬件逻辑实现
可使用8个一位全加器FA通过进位串联得到8位串行进位加法器
溢出检测:$** OF = C_{7+1} \oplus C_{6+1} $**
n 位 串行进位加法器如何同时实现加减法?
给每个加法器的第二个输入端都连一个异或门,第二个输入改为 s u b ⊕ Y i sub \oplus Y_i sub⊕Yi:
- 加法:sub = C0 = 0
- 减法:sub = C0 = 1
性能分析:
假设基本逻辑门 OR、AND 的传播延迟为1T,假设复合逻辑门 XOR 的传播延迟为3T,假设仅考虑逻辑门的传播延迟,不考虑信号在线路上的传播时延
练习
1、R1 = 86H, R5 = 90H, R6 = 7CH
2、m = -122H、k1 = -112H
3、可以。
n 位加法器实现的是模 2^n 无符号整数加法运算。对于无符号整数a和 b、a + b 可以直接用加法器实现,而 a - b 可用 a + b 的补数实现,即 a − b = a + [ − b ] 补 ( m o d 2 n ) a - b = a + [-b]_{补} (mod \ 2^n) a−b=a+[−b]补(mod 2n),所以n位无符号整数加减运算都可在 n 位加法器中实现。
由于带符号整数用补码表示,补码加/减运算公式为: [ a + b ] 补 = [ a ] 补 + [ b ] 补 ( m o d 2 n ) [a + b]_{补} = [a]_{补} + [b]_{补} (mod2^n) [a+b]补=[a]补+[b]补(mod2n)[ a − b ] 补 = [ a ] 补 + [ − b ] 补 ( m o d 2 n ) [a - b]_{补} = [a]_{补} +[-b]_{补} (mod2^n) [a−b]补=[a]补+[−b]补(mod2n),所以n位带符号整数加/减法运算都可在n位加法器中实现。
4、带符号整数加/减运算的溢出判断规则为:若加法器的两个输入端(加数)的符号相同,且不同于输出端(和)的符号,则结果溢出。(或加法器完成加法操作时,若次高位的进位和最高位的进位不同,则结果溢出)
最后一条语句执行时会发生溢出。
2.6 先行进位加法器的硬件逻辑实现
在 n 位串行进位加法器中,每个高位的一位全加器 FA 的运算依赖于相邻低位的一位FA的进位Ci+1,因此所有一位 FA 不能并行运行,其时间关键延迟为 (2n + 4)T,与串行进位加法器的位数 n 呈线性关系当 n 较大时性能较差。
我们分析一下n 位串行进位加法器的逻辑表达式:
S i = X i ⊕ Y i ⊕ C i C i + 1 = X i Y i + ( X i ⊕ Y i ) C i 构造进位生成函数 G i = X i Y i ,进位传递函数 P i = X i ⊕ Y i 则 S i = P i ⊕ C i , C i + 1 = G i + P i C i 则 : C 1 = G 0 + P 0 C 0 C 2 = G 1 + P 1 C 1 = G 1 + P 1 G 0 + P 1 P 0 C 0 C 3 = G 2 + P 2 C 2 = G 2 + P 2 ( G 1 + P 1 G 0 + P 1 P 0 C 0 ) = G 2 + P 2 G 1 + P 2 P 1 G 0 + P 2 P 1 P 0 C 0 C 4 = G 3 + P 3 C 3 = G 3 + P 3 ( G 2 + P 2 G 1 + P 2 P 1 G 0 + P 2 P 1 P 0 C 0 ) = G 3 + P 3 G 2 + P 3 P 2 G 1 + P 3 P 2 P 1 G 0 + P 3 P 2 P 1 P 0 C 0 ⋮ C n = C n − 1 + P n − 1 G n − 2 + ⋯ + P n − 1 P n − 2 … P 1 P 0 C 0 \begin{align} & S_i = X_i\oplus Y_i \oplus C_i \\ & C_{i + 1} = X_iY_i + (X_i \oplus Y_i)C_i \\ & 构造 进位生成函数 G_i = X_iY_i, 进位传递函数P_i = X_i \oplus Y_i \\ & 则 S_i = P_i \oplus C_i, C_{i+1} = G_i + P_iC_i \\ & 则: \\ & C_1 = G_0 + P_0C_0 \\ & C_2 = G_1 + P_1C_1 = G_1 + P_1G_0 + P_1P_0C_0 \\ & C_3 = G_2 + P_2C_2 = G_2 + P_2(G_1 + P_1G_0 + P_1P_0C_0)= G_2+P_2G_1+P_2P_1G_0+P_2P_1P_0C_0\\ & C_4 = G_3 + P_3C_3 = G_3 + P_3(G_2+P_2G_1+P_2P_1G_0+P_2P_1P_0C_0) = G_3+P_3G_2+P_3P_2G_1 + P_3P_2P_1G_0 + P_3P_2P_1P_0C_0 \\ & \vdots \\ & C_n = C_{n-1} + P_{n-1}G_{n-2} + \dots + P_{n-1}P_{n-2}\dots P_1P_0C_0 \end{align} Si=Xi⊕Yi⊕CiCi+1=XiYi+(Xi⊕Yi)Ci构造进位生成函数Gi=XiYi,进位传递函数Pi=Xi⊕Yi则Si=Pi⊕Ci,Ci+1=Gi+PiCi则:C1=G0+P0C0C2=G1+P1C1=G1+P1G0+P1P0C0C3=G2+P2C2=G2+P2(G1+P1G0+P1P0C0)=G2+P2G1+P2P1G0+P2P1P0C0C4=G3+P3C3=G3+P3(G2+P2G1+P2P1G0+P2P1P0C0)=G3+P3G2+P3P2G1+P3P2P1G0+P3P2P1P0C0⋮Cn=Cn−1+Pn−1Gn−2+⋯+Pn−1Pn−2…P1P0C0
向高位的进位输出Cn由 Gi、Pi以及C0经过逻辑运算得到,Cn不再依赖于Cn-1。
4位先行进位加法器的组合逻辑电路:
值得注意的是,先行进位电路的位数越多,逻辑门的扇入系数(输入引脚数)越大,制造难度越大,一般情况下,门电路的扇入系数为1~5,最多不超过8。
假定各逻辑门的传播延迟为 1T,不考虑信号在线路上的传播时延,则上述电路的总时间延迟为多少?
2T
基于4位先行进位电路构建4位快速加法器
4位快速加法器与4位串行进位加法器性能比较
- n位串行进位加法器
- 当n=4时,为4位串行进位加法器 Sn-1 的时间延迟为:(2x4+4)T=12T
- 4位快速加法器:时间延迟为8T
使用4位快速加法器构建更大位宽的加法器电路
进一步提升性能的方法?
4位一组,组内并行进位、组间串行进位的16位加法器,如果可以利用先行进位电路提前产生C4、C8、C12、C16信号,则可以实现组间并行进位。
组进位生成函数: G ∗ = G з + P з G 2 + P з P 2 G 1 + P з P 2 P 1 G 0 G^*= G_з+ P_зG_2+ P_зP_2G_1+ P_зP_2P_1G_0 G∗=Gз+PзG2+PзP2G1+PзP2P1G0
组进位传递函数: P ∗ = P 3 P 2 P 1 P 0 P_* = P_3P_2P_1P_0 P∗=P3P2P1P0
类似地,我们可以构建16位组内并行、组间并行加法器
三、定点数的乘法运算和除法运算
3.1 无符号数乘法运算部件的硬件逻辑实现
引例——二进制龟速乘
int mul(int a, int b) {int res = 0;for(; b > 0; b >>= 1, a <<= 1) {if (b & 1) {res += a; }}return res;
}
其实就是小学的列竖式乘法。
无符号数乘法运算的硬件逻辑实现
- 需要一个位宽为4位的寄存器存放被乘数 x;还需要两个位宽为 4 位的寄存器分别存放部分积和最终乘积的高位和低位,初始阶段高位寄存器被清 0,低位寄存器存放乘数 y。再配上加法器及其他相应电路,即可实现乘法运算。
示例:
3.2 原位乘法运算部件的硬件逻辑实现
- 由于原码表示与无符号数非常类似,仅比无符号数多一个符号,而乘积的符号可以通过参与运算的两个数各自符号的逻辑异或求得。
- 因此,上述无符号数乘法运算的硬件逻辑实现,可用于原码一位乘法仅需添加符号位处理即可。
硬件组合逻辑电路:
运算逻辑:
运算示例:
-
可见原码一位乘法运算部件把符号位也存入了初始操作数,这是为了最后根据二者符号位异或值来计算真正符号位
-
对于定点整数原码乘法,其过程与定点小数原码乘法完全相同,仅将符号位与数值位之间的小数点改为逗号即可。
-
如果每次根据乘数中的两位来计算位积,则位积的数目会减少一半,因此循环累加次数将减少一半,可以大大提升乘法的运算速度,这种乘法称为二位乘法,本文不做介绍。
3.3 补码乘法运算的硬件逻辑实现
3.3.1 Booth 算法
由于计算机中采用补码表示数据,如果用原码乘法计算两个数的乘积,则运算前需要将补码转换为原码、运算后还需要将原码再转换为补码,这样会增加许多操作步骤。为了减少处理环节,英国的布斯(Booth)夫妇于1950年提出了一种补码乘法,又称为Booth算法。
补码一位乘运算法则
被乘数X的符号任意,乘数Y的符号为正
被乘数X的符号任意,乘数Y的符号为负
将两个式子合并:
式子优化
添加辅助位 Y n + 1 = 0 Y_{n+1} = 0 Yn+1=0
- 总结:通过推导,我们将补码乘法,转换成了类似与原码乘法那样的加法,右移的过程
3.3.2 补码一位乘法运算(Booth算法)的硬件逻辑实现
下面是硬件逻辑实现:
- 这里解释一下为什么要用双符号位
- 因为如果运算过程中要进行减法,那么在进行补码转换的时候会有溢出风险,因为负数的绝对值范围是大于正数的
- 其次,运算过程中会出现绝对值大于1的但是实际上并非发生溢出的情况
- 当采用双符号位,即可正确判断溢出
- 选择器部件:
- 有三种选择:
- X,即进行加法,此时ALU的+1信号不会选通
- X,即将减法转化为加法,此时ALU的+1信号会选通,用于X+1得到补码
- 0,即 Yn+1 - Yn = 0,的情况,此时ALU的+1信号不会选通
- 有三种选择:
运算示例:
运算逻辑:
3.3.3 练习
(1)
- 计算机内部采用补码来表示数值数据。
- 补码的乘法运算可以通过加法和算术右移来实现。
- 编译器可将补码的乘法运算转换为一段循环代码,其内容包含比较、加法和算术右移等指令,进而实现乘法运算,这属于软件实现乘法运算。
(2)
控制“加法、算术右移”操作。
(3)
- a)没有乘法指令
- 属于软件实现,需要反复执行很多条指令,而对于每条指令,都需要经历“取指、译码、取数、执行、保存结果”这一过程,因此执行时间比较长。
- b)有使用ALU和位移器实现的乘法指令
- 只需用一条乘法指令即可实现乘法运算,但乘法指令需要多个时钟周期才能完成。
- c)使用阵列乘法器实现的乘法指令
- 只需用一条乘法指令即可实现乘法运算,但乘法指令可在一个时钟周期内完成。
(4)
0000 0000 FFFF FFFEH
溢出
对于无符号整数乘法运算,当仅取乘积的低 n 位作为乘法结果时,则 2n 位乘积的高n位不为全0时,可判断为产生溢出。
B
r2 * r3 = 1568
3.3.4 无符号阵列乘法器
- 原码、补码一位乘法的硬件逻辑实现,需要在时钟节拍下、通过控制逻辑的控制,执行相应轮次的**“加法、右移”**操作来实现,速度较慢。
- 为了提高运算速度,可以仅采用组合逻辑电路以专用硬件方式构建阵列乘法器
- 构建阵列乘法器的基本思想是模仿二进制乘法的笔算方法
组合逻辑
运算示例
运算性能分析
- 注意到第一行的全加器都是0进位输入,所以改成半加器还可以进一步的减少逻辑门数量和时间延迟
- 还可将最下面一行全加器采用先行进位电路进一步优化运算速度
阵列乘法器结构规范标准化程度高,有利于布局布线,适合用超大规模集成电路实现,且可以获得较高的运算速度,其运算速度仅取决于逻辑门和加法器的传输延迟。
3.3.5 补码阵列乘法器
- 如果不考虑原码的符号位,则原码的数值位可看作是无符号数。
- 如果将原码的符号位单独处理,则原码乘法运算,可将被乘数原码的数值位和乘数原码的数值位直接代入无符号阵列乘法器进行运算。
- 得到的结果为无符号乘积,在其前面添加单独处理的符号位,即可得到原码乘法的结果
- 原码与补码之间可以相互转换,可采用反码法或扫描法。
- 如果将补码的符号位单独处理,将补码的数值位转换成原码的数值位,就可利用无符号阵列乘法器进行乘法运算。
- 得到的结果为无符号乘积,将其转换成补码的数值位,然后在其前面添加单独处理的符号位,即可得到补码乘法的结果。
示例
求补电路的实现
第一种方法:使用全加器(硬件开销大,时间延迟长)
第二种方法:直接使用简单逻辑门组合(延迟低)
值得注意的是:可以构建不使用求补电路,而使用补码直接参与乘法运算的直接补码乘法电路。本文不做介绍。
3.4 定点数的除法运算
3.4.1 原码除法运算(恢复余数法)
- 由于原码表示与无符号数非常类似,仅比无符号数多一个符号,因此,进行原码除法运算时,可将符号位与数值部分分开处理。
- 商的符号:由被除数和除数各自的符号进行异或运算求得;
- 商的数值部分:由被除数和除数各自的数值部分(即真值的绝对值)相除求得。
- 以上是定点小数(纯小数)原码除法运算的处理方法,为了确保商和余数也为定点小数(即不发生溢出),上述除法的条件为|X| < |Y|。
- 同理,定点整数原码除法运算的条件为|X| ≥ lYl。
原码除法的法则
原码除法(恢复余数法)流程图
运算示例:
从本例可以看出,由于运算过程中可能需要恢复余数,并且恢复余数的次数和具体的操作数相关,极端情况下每一步运算都需要恢复余数,因此,该方法的最大缺点是运算时间不确定,另外,其控制电路也比较复杂
硬件逻辑如下:
3.4.2 原码除法运算(不恢复余数法)
我们分讨一下试探余数的情况:
- 将运算过程中某次的余数记为Ri
- 将相应的上商位记为Qi
- 如果 Ri >= 0
- 则 Qi = 1,Ri+1 = 2Ri - y
- 如果 Ri < 0
- 则 Qi = 0,Ri+1 = 2Ri + y
- 如果 Ri >= 0
- 当第 i 次中间余数Ri为负时,可以跳过恢复余数这一步,直接求第i + 1次中间余数Ri+1。这种算法称为不恢复余数法
运算示例:
值得注意的是:
- 最后一次运算上商时,若余数小于0,此时虽然所有上商位都已经得到了,但负余数还需要加上除数y恢复成正数。
- 不难发现,上商位与进位位的值是相同的。因此在硬件逻辑实现时,可用加法器的进位输出作为上商的控制信号以及可控加减法电路的控制信号。
3.4.3 补码除法运算(不恢复余数法)
- 与原码除法将符号位和数值部分分开处理不同,补码除法将符号位和数值部分一起参加运算,商符是在求商的过程中自然形成的。因此,补码除法的运算方法没有原码除法的运算方法直观,需要解决以下3个主要问题:
- 如何确定商值
- 如何形成商符
- 如何得到新余数
如何确定商值
- 由于补码除法中的被除数、除数和中间余数都是有符号的,因此,不能像原码除法(符号位单独处理)那样直接用做减法来判断是否“够减”
- 补码除法**判断是否“够减”**的依据是:中间余数(初始为被除数)与除数之间符号的异同以及相应做减法或加法后结果的符号。
- 当被除数(或中间余数)与除数同号时,做减法,若得到的新余数的符号与除数符号一致表示够减,否则为不够减。
- 当被除数(或中间余数)与除数异号时,做加法,若得到的新余数的符号与除数符号一致表示不够减,否则为够减。
- 在判断出是否“够减”后,就可以确定相应的上商位的值:
- 若 [ X ] 补 [X]_{补} [X]补与 [ Y ] 补 [Y]_{补} [Y]补同号,则商为正,“够减”时上商 1,“不够减”时上商0 (按原码规则上商)
- 若 [ X ] 补 [X]_{补} [X]补与 [ Y ] 补 [Y]_{补} [Y]补异号,则商为负,“够减”时上商 0,“不够减”时上商1 (按反码规则上商)
- 我们发现被除数和除数无论是否异号,他们在余数和除数是否异号时的上商位是一样的,这就实现了统一
如何确定商符
- 补码除法将符号位和数值部分一起参加运算,商符是在求商的过程中自然形成的。
- 在定点小数(纯小数)的除法中,被除数的绝对值必须小于除数的绝对值,否则商会大于 1 而溢出。
如何得到新余数
新余数 [ R i + 1 ] 补 [Ri+1]_补 [Ri+1]补的获取方法与原码除法不恢复余数法(加减交替法)是类似的,规则如下:
- 我们将四种情况的恢复/不恢复的情况归纳为了两种情况:
- 同号上1减补码
- 异号上0加补码
- 如果对商的精度没有特殊要求,一般可采用**“末位恒置 1”法**,这种方法操作简单,易于实现而且最大误差仅为 2 − n 2^{-n} 2−n。
运算示例:
类似阵列乘法器,我们也可以设计阵列触发器,这里略。
3.5 浮点运算
3.5.1 浮点加减法运算(非IEEE754标准)
- 尾数末位的几位会因超出计算机字长而被丢弃,从而产生误差。此时,计算机可以按选定的方式在尾数右规时,进行舍入操作。
- 在尾数规格化和尾数舍入时,可能会对结果的阶码执行加、减运算。因此,必须考虑结果的阶码出现溢出的问题
- 由于浮点数中阶码的位数决定了浮点数的表示范围,因此,对于浮点运算,当阶码出现溢出时,表示运算结果出现溢出。
浮点加减法运算步骤:
- 对阶,小阶向大阶看齐
- 尾数运算,移出位暂时保留,称为保留附加位。保留附加位参与中间运算以提高运算精度:尾数运算结束,结果规格化后再进行舍入。
- 结果规格化
- 左规:尾数每左移1位,阶码减1,直到尾数成为规格化数为止(但是如果阶码符号位变成10,则判断下溢,可认为结果为0)
- 左规:尾数每右移1位,阶码加1,直到尾数成为规格化数为止(但是如果阶码符号位变成01,则判断上溢,可认为结果为∞)
- 舍入处理
- 在进行对阶时会用到算术右移,而进行结果规格化时,可能会用到算术右移。这会导致尾数未位的几位因超出机器字长而被丢掉,从而产生误差。此时,机器可按选定方式进行舍入处理:
- **截断法:**直接丢弃超出机器字长的尾数低位(导致误差积累)。
- **末位恒置1法:**将机器字长内的尾数的最低位恒置为1(损失1位精度,但误差积累较小)。
- **0舍1入法:**当需要丢弃的尾数低位中的最高位为1时,将机器字长内的尾数的最低位加1。
- 在进行对阶时会用到算术右移,而进行结果规格化时,可能会用到算术右移。这会导致尾数未位的几位因超出机器字长而被丢掉,从而产生误差。此时,机器可按选定方式进行舍入处理:
运算示例:
练习
2 − 011 × ( − 0.100111 ) 2^{-011} \times (-0.100111) 2−011×(−0.100111)
D
3.5.2 IEEE 754 浮点加减法运算
- IEEE 754 浮点数的阶码采用移码表示,尾数采用原码表示,并且尾数的最高位隐藏。
- 因此,IEEE 754浮点数的加减运算与(上节课介绍的)基于补码表示的浮点数的加减运算有如下不同:
- 在对阶和结果规格化过程中,涉及到阶码的加减运算时采用移码的加减运算规则。
- 尾数运算采用原码运算规则,且隐藏位要参与尾数运算。
- 隐藏位参与尾数规格化判断和规格化过程。
- 若尾数形式为1. ……,则为规格化尾数。
- 若尾数形式为0. ……,则需要进行左规(将尾数左移1位,相应地将阶码减1),直到尾数规格化为止。
- 若尾数形式为1b. ……,则需要进行1次右规(将尾数右移1位,相应地将阶码加1)。
- 舍入处理:
- 就近舍入:舍入为可表示的最近的数,如果数据正好处于两个可表示的数的中间,则向偶数舍入。
- 朝正∞方向舍入:总是取右侧可表示的最近的数。
- 朝负∞方向舍入:总是取左侧可表示的最近的数。
- 截断处理:直接丢弃多余位,朝0方向舍入。
- 溢出判断:
- 浮点运算的溢出可通过阶码的溢出来判断。对于IEEE 754单精度浮点数而言,向右规格化使阶码为全1(即11111111,真值为-128)时发生规格化上溢;向左规格化使阶码为全0时发生规格化下溢。
练习
x = 2^{-126} * 1.1,y = 2^{-126} * 0.1
x - y = 2^{-127} * 1 = 0040 0000H
3.5.3 浮点乘法运算
设 X 和 Y 是两个浮点数, E X 和 E Y E_{X}和 E_{Y} EX和EY分别是它们各自的阶码, M X M_X MX 和 M Y M_Y MY 分别是它们各自的尾数。
3.5.4 浮点除法运算
3.6 运算器
- 通过本章中前面各节课的介绍可知:
- 计算机中的各类算术运算都可以利用基本的定点加法运算和移位运算来实现。
- 将实现加法运算、移位运算、逻辑运算以及各种算术运算所需的数字逻辑电路集成在一起,就可以构成CPU中的运算器。
- 运算器一般分为以下两种:
- 定点运算器:以算术逻辑单元ALU为核心,可以进行定点数的移位、算术、逻辑运算。
- 浮点运算器:以浮点运算单元FPU为核心,负责进行浮点数的算术运算。
- 浮点运算比定点运算复杂得多,因此,实现浮点运算的逻辑电路也比较复杂,早期将其实现电路集成在一个单独的芯片中,目前大多集成在CPU内部。
【举例1】能够完成“与”、“或”、“加法”共3种运算的一位ALU。
【举例2】由n个一位ALU构成的n位ALU。
常见的状态标志位
-
ZF(Zero Flag):为1表示运算结果为0
-
OF(Overflow Flag):为1表示有符号运算溢出
-
SF(Sign Flag):为1表示运算结果为负数
-
CF(Carry Out Flag):表示加法进位输出、减法借位输出或逻辑左移操作的溢出位
-
不同计算机利用这些标志的方法和时机可能不同:
- 很多计算机将这些标志位暂存在一个状态寄存器中,为后续指令提供执行依据。例如,x86的EFLAGS寄存器,x86中的条件分支指令会根据标志位的不同进行不同的操作。
- 有些计算机没有状态寄存器,例如MIPS、RISC-V,其条件分支指令直接根据ALU当前状态标志位执行不同的分支。