mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-11-02 13:23:47 +08:00
更新文件管理
This commit is contained in:
@@ -111,8 +111,46 @@ $D.$以上均可
|
||||
|
||||
![原码一位乘法][yuanmayiwei]
|
||||
|
||||
补码一位乘法
|
||||
|
||||
**例题** 设机器字长为$n+1=5$位(含$1$位符号位),其中$x$的原码为$-0.1101$,$y$的原码为$0.1011$,采用原码一位乘法求$x\cdot y$。
|
||||
|
||||
![补码一位乘法][bumayiwei]
|
||||
|
||||
所以$x\cdot y=-0.10001111$。
|
||||
|
||||
#### 定点数除法运算
|
||||
|
||||
原码恢复余数法
|
||||
|
||||
**例题** 设机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。
|
||||
|
||||
其中x就是+0.1011,而y就是+0.1101。先抛去符号位,就得到01011和01101两个数据。然后求出y绝对值的补码:01101和-y绝对值的补码:10011。
|
||||
|
||||
将MQ、ACC、X都初始化为五位存储单元。将被除数01011放入ACC中,将除数01101放入X中,商初始化为00000。
|
||||
|
||||
手算时每位商取0/1是通过判断当前余数和除数的大小确定的。而机器实现时就要通过ALU判断是ACC中的数更大还是X中的数更大,如果ACC的更大就商1,若X的更大就商0。
|
||||
|
||||
第一位默认商1,ACC-=X,ACC的01011和X的10011(X实际值的负值的补码)输入ALU进行加操作01011+10011=11110,返回给ACC,此时发现代表符号的最高位为1,代表出现了负数,就表明之前的商出错了,所以重新确定商为0,ACC要恢复余数,从而再加上y的补码:11110+01101=01011。
|
||||
|
||||
第一位的商计算完后需要进行计算,错位相除,所以同乘法一样,ACC和MQ的值都要逻辑左移一位,低位补0,所以MQ由00000还是变为00000,MQ的最高位的0移到ACC最低为,ACC最高位丢弃,由01011变成10110。
|
||||
|
||||
然后第二位默认商1,同样ACC-=X,10110+10011=01001,将这个值赋给ACC,发现符号位为0,代表正,商就没有问题,MQ为00001。
|
||||
|
||||
再次逻辑左移一位,MQ由00001变为00010,ACC由01001变为10010。
|
||||
|
||||
第三位默认商1,同样ACC-=X,10010+10011=00101,商没有问题,MQ为00011。
|
||||
|
||||
再次逻辑左移一位,MQ由00011变为00110,ACC由00101变为01010。
|
||||
|
||||
第四位默认商1,同样ACC-=X,01010+10011=11101,高位为1,商应该为0,MQ变为00110,ACC恢复余数:11101+01101=01010。
|
||||
|
||||
再次逻辑左移一位,MQ由00110变为01100,ACC由01010变为10100。
|
||||
|
||||
第五位默认商1,同样ACC-=X,10100+10011=00111,高位为0,商没有问题,MQ为01101。
|
||||
|
||||
此时计算结束,商为01101,余数为00111。
|
||||
|
||||
![buhuifuyushu]
|
||||
|
||||
![jiajianjiaoti]
|
||||
|
||||
@@ -380,6 +380,15 @@ k|2|3|4|5|6|7
|
||||
+ 为了加快运算会有辅助电路实现$(-x)$的补码的运算。
|
||||
+ 最后一次不需要移位直接根据辅助位和$MQ$最后一位判断进行相加。从而让乘数的符号位也参数运算中来确定最后结果的符号。
|
||||
|
||||
$Booth$算法的移位法则:
|
||||
|
||||
$y_n$(高位)|$y_{n+1}$(低位)|操作
|
||||
:-----------:|:---------------:|:--:
|
||||
0|0|部分积右移一位
|
||||
|0|1|部分积加$[X]_{\text{补}}$,右移一位
|
||||
1|0|部分积加$[-X]_{\text{补}}$,右移一位
|
||||
1|1|部分积右移一位
|
||||
|
||||
|原码|补码
|
||||
:----:|:--:|:--:
|
||||
计算流程|n轮加法、移位|n轮加法、移位,最后进行一次加法
|
||||
@@ -391,15 +400,11 @@ k|2|3|4|5|6|7
|
||||
|
||||
#### 定点数除法运算
|
||||
|
||||
进行除法操作时,都是为了找到一位能让商乘除数能最大即余数最小但大于0的值。若除数被除数都是小数,可以同时乘一个数变成整数再运算。
|
||||
+ 进行除法操作时,都是为了找到一位能让商乘除数能最大即余数最小但大于$0$的值。若除数被除数都是小数,可以同时乘一个数变成整数再运算。
|
||||
+ 所以可以忽略小数点,每确定一位商进行一次减法,若机器字长为$n$位,则得到$n-1$位余数,在余数末尾补$0,再确定下一位商$0$或$1$,直到确定$n$位商即可停止。
|
||||
+ 在运算器的组成时出现一个表格,说明在进行除运算时,$ACC$保存被除数和余数,$MQ$保存商,$X$保存除数。
|
||||
|
||||
所以可以忽略小数点,每确定一位商进行一次减法,若机器字长为n位,则得到n-1位余数,在余数末尾补0,再确定下一位商0或1,直到确定n位商即可停止。
|
||||
|
||||
在运算器的组成时出现一个表格,说明在进行除运算时,ACC保存被除数和余数,MQ保存商,X保存除数。
|
||||
|
||||
##### 原码恢复余数法
|
||||
|
||||
原码使用恢复余数法进行除运算:
|
||||
原码恢复余数法:
|
||||
|
||||
1. 字长若为n+1位,则ACC、MQ、X全部初始化为n位,将被除数的绝对值放入ACC中,X放入除数的绝对值,MQ初始化为全0。
|
||||
2. 将MQ的最右边的一位当做当前除运算位,让其进行除运算,运算规则是,默认商1,ACC-=X,即x的补码要加上除数的绝对值的负值的补码(减法都由补码的加法实现),判断是否有误。若结果高位为0则无误,高位为1则有误,错误则商改为0,并恢复余数,ACC加上X中除数的补码。
|
||||
@@ -408,51 +413,18 @@ k|2|3|4|5|6|7
|
||||
5. 定点小数的小数位隐藏在符号位后面第一位,定点正数的小数位隐藏在最后一位后。
|
||||
6. 将两个符号位的异或结果赋值给商最高位。
|
||||
|
||||
**例题** 设机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。
|
||||
原码加减交替法:
|
||||
|
||||
其中x就是+0.1011,而y就是+0.1101。先抛去符号位,就得到01011和01101两个数据。然后求出y绝对值的补码:01101和-y绝对值的补码:10011。
|
||||
|
||||
将MQ、ACC、X都初始化为五位存储单元。将被除数01011放入ACC中,将除数01101放入X中,商初始化为00000。
|
||||
|
||||
手算时每位商取0/1是通过判断当前余数和除数的大小确定的。而机器实现时就要通过ALU判断是ACC中的数更大还是X中的数更大,如果ACC的更大就商1,若X的更大就商0。
|
||||
|
||||
第一位默认商1,ACC-=X,ACC的01011和X的10011(X实际值的负值的补码)输入ALU进行加操作01011+10011=11110,返回给ACC,此时发现代表符号的最高位为1,代表出现了负数,就表明之前的商出错了,所以重新确定商为0,ACC要恢复余数,从而再加上y的补码:11110+01101=01011。
|
||||
|
||||
第一位的商计算完后需要进行计算,错位相除,所以同乘法一样,ACC和MQ的值都要逻辑左移一位,低位补0,所以MQ由00000还是变为00000,MQ的最高位的0移到ACC最低为,ACC最高位丢弃,由01011变成10110。
|
||||
|
||||
然后第二位默认商1,同样ACC-=X,10110+10011=01001,将这个值赋给ACC,发现符号位为0,代表正,商就没有问题,MQ为00001。
|
||||
|
||||
再次逻辑左移一位,MQ由00001变为00010,ACC由01001变为10010。
|
||||
|
||||
第三位默认商1,同样ACC-=X,10010+10011=00101,商没有问题,MQ为00011。
|
||||
|
||||
再次逻辑左移一位,MQ由00011变为00110,ACC由00101变为01010。
|
||||
|
||||
第四位默认商1,同样ACC-=X,01010+10011=11101,高位为1,商应该为0,MQ变为00110,ACC恢复余数:11101+01101=01010。
|
||||
|
||||
再次逻辑左移一位,MQ由00110变为01100,ACC由01010变为10100。
|
||||
|
||||
第五位默认商1,同样ACC-=X,10100+10011=00111,高位为0,商没有问题,MQ为01101。
|
||||
|
||||
此时计算结束,商为01101,余数为00111。
|
||||
|
||||
##### 原码加减交替法
|
||||
|
||||
因为恢复余数很麻烦,所以会考虑是否不用恢复余数,直接进行运算得到后面的结果。
|
||||
|
||||
假如令原始值为x,原始值加上-y绝对值的补码结果为a,y绝对值的补码为b,按恢复余数法,a这个余数是一个负值,所以要加上b即a+b变成原始值a+b=x,这时候商0,然后计算下一个商,余数a+b左移一位,即(a+b)×2=2a+2b,这时候商1看看结果是否正确,即2a+2b要减去y绝对值的补码(等价于加上-y绝对值的补码)2a+2b-b=2a+b。
|
||||
|
||||
所以如果得到了一个负的余数a,可以直接转换到2a+b这个结果,即直接左移一位余数再加上除数的补码就可以得到结果。
|
||||
|
||||
这就是加减交通法或不恢复余数法。
|
||||
|
||||
从而恢复余数法就是当余数为负时商0,并+|除数|,再左移,再-|除数|,而加减交替法是当余数为负时商0,并左移,再+[除数|,若余数为正时商1,并左移,再-|除数|。
|
||||
|
||||
值得注意的是,若在最后一步余数为负,需要商0,并加上除数的补码得到正确余数。
|
||||
+ 因为恢复余数很麻烦,所以会考虑是否不用恢复余数,直接进行运算得到后面的结果。
|
||||
+ 假如令原始值为x,原始值加上-y绝对值的补码结果为a,y绝对值的补码为b,按恢复余数法,a这个余数是一个负值,所以要加上b即a+b变成原始值a+b=x,这时候商0,然后计算下一个商,余数a+b左移一位,即(a+b)×2=2a+2b,这时候商1看看结果是否正确,即2a+2b要减去y绝对值的补码(等价于加上-y绝对值的补码)2a+2b-b=2a+b。
|
||||
+ 所以如果得到了一个负的余数a,可以直接转换到2a+b这个结果,即直接左移一位余数再加上除数的补码就可以得到结果。
|
||||
+ 这就是加减交通法或不恢复余数法。
|
||||
+ 从而恢复余数法就是当余数为负时商0,并+|除数|,再左移,再-|除数|,而加减交替法是当余数为负时商0,并左移,再+[除数|,若余数为正时商1,并左移,再-|除数|。
|
||||
+ 值得注意的是,若在最后一步余数为负,需要商0,并加上除数的补码得到正确余数。
|
||||
|
||||
<span style="color:orange">注意:</span>在定点小数运算时,商只能是小数而不能是整数,所以被除数一定要小于除数,机器判断标准是看第一步计算的商,若第一步计算的商是1则代表结果大于1,机器就会报错。
|
||||
|
||||
##### 补码加减交替法
|
||||
补码加减交替法:
|
||||
|
||||
+ 符号位参与运算。
|
||||
+ 被除数÷余数、除数采用双符号位。
|
||||
|
||||
Reference in New Issue
Block a user