运算方法
1.定点数的加减法
定点数的加减法很简单,可以归结为补码的加法运算。
加法:(a+b) = [a]补+[b]补 = [a+b]补
减法:(a-b) = [a]补 + [-b]补 = [a-b]补
总结:对定点数的加减法转化为补码的加法最后再利用补码原码的转换就可以了。
2.浮点数的加减法
浮点数的加减法对于定点数的加减法来说就有点复杂。大致分为5个部分:
- 对阶
小阶对大阶的方式。就是由阶数较小的向阶数较大的看齐,为什么要用小阶对大阶的方式呢?先看一下大阶对小阶的方式是怎样的。大阶对小阶,尾数左移阶码减少。采用这样的的方式尾数最左边的的阶码移出,最右边补零。因为最左边的小数权值最大的,因此这种方式造成的误差也是最大的。所以采用小阶对大阶的方式,尾数右移,最右边的小数移出,最左边补符号位。为什么要补符号位?因为这里的尾数使用的是补码形式!可以下去试一下补符号位和补零后原码的区别。 - 尾数运算
尾数运算就比较简单了,相当于直接进行定点数的加减法(这里直接进行运算姐可以了,此时尾数已经为补码形式)这里解释一下尾数的补码形式:符号位.[M]补,例如尾数1.11010表示的原码是 - 00110。尾数运算产生的进位保留。 - 规格化
右归:Cf⊕Co = 1时,进行左归运算。小数点(严格来说这里只是用来隔开符号位)左边的第一位进入小数点右边的第一位,小数点左边的第二位补上第一位的位置。补码最右边的不用丢弃(用括号括起来表示超出定点范围即可)。为什么这里超出范围的数值要保留呢?这是因为进行尾数运算时尾数是放在了一个比尾数更大范围的存储器内进行运算的,因此最左边的小数未丢失。Cf⊕Co = 0时,直接进行进位的舍弃。
左归:当Cf⊕Co = 1时,停止左归。为什么要进行左归,因为最左边的数值权值是最大的,我们不希望这个位置是0,这样子会减少小数的精度。因此我们希望左归知道最左边的数值(原码)是不为零的。换个思路想想,当我们左移时,最右边超出浮点数范围的非零数值就可以进入定点区域,这样子就可以提高精度了!
无论是进行左归还是右归,阶码都要进行改变。 - 尾数处理
超出定点区域的数值,如果最左边是1,则进1,否则简单截尾就可以了。(截尾就是将超出范围的数值简单丢失)特殊的,当超出范围的数为100(0可写可不写)时,我们得看最右边的小数,为1时进1,否则截尾。 - 溢出判断
溢出判断就是看在规格化的过程中阶码是否溢出。(不懂什么是怎么判断溢出?请看下文!)
溢出判断
- 单符号位检测法
运算完后,Cf⊕Co = 0,表示溢出,否则不溢出。上溢下溢看运算结果,负加负得正则为下溢,正加正得负则为上溢。 - 双符号位检测法(变形补码)
用两个数值表示双符号位表示正负。运算后双符号位有四种情况:
00,11:表示正常(表示正数还有负数)
01,10:表示上溢下溢
运算器
诶?乘除法还没讲呢!老师没教我就不会了咯orz...乘除法没讲我们可以看一下乘除法的运算器 - -
先看一下加法运算器: ALU 。没什么好讲的,记一下两个公式:
- Si = Ai + Bi + Ci
- Ci+1 = AiBi + AiCi + BiCi = AiBi +( Ai⊕Bi)
接下来看介绍一下并行乘法器:
- 不带符号的阵列乘法器
每一行的计算都是并行的,除了最后一行。假如是nm,则一共需要nm个与门,需要(n-1)*m个FA。 - 带符号的阵列乘法器
跟不带符号的差别就是,在运算前先对运算的数值进行求补,然后再对运算后的数值再一次进行求补。因此带符号位的乘法器在结构上多了两个算前求补器以及一个算后求补器。算前求补器的作用是取绝对值,算后求补器的话是对运算结果(绝对值的乘法)变成有符号的数。 - 直接补码的并行乘法
了解一下,能直接参与乘法运算的还有补码。
最后是多功能的算术逻辑运算单元(ALU)
先行进位发行器(CLA)74181,74182的区别。74181是给3位FA产生进位的,然后自己输出一个C3。而74182是给3个181传输进位的,然后自己产生一个C15。值得注意的是,若进行32位的并行运算的话,需要3个74182,因为最上方还需要一个74182给两个74182传输进位。
网友评论