以下内容以例题:
用原码一位乘法计算x * y
x = - 0.11111 , y = 0.11101 为例。
1.运算方法
1.乘积符号的确定
被乘数 [ x ]原 = x0.x1…xn ,乘数[ y ]原 = y0.y1…yn ,x0和y0为乘数和被乘数的符号位,原码乘积的符号与两个符号位的关系为异或,即 Pf = x0 ⊕ y0 (“⊕”为异或符号,两数相同为0,不同为1) ,即被乘数与乘数同号,乘积为正,异号则为负。
例题 [ x ]原 = 1.11111 ,[ y ]原 = 0.11101 ,Pf = x0 ⊕ y0 = 1 ⊕ 0 = 1 ,乘积为负。
2.乘积的数值
乘积的运算为以下递归公式:
Pi + 1 = ( Pf + yn - i | x | )2-1
该公式采用递归计算乘积,设置累加寄存器存放部分积P,初始值P0 = 0,每得到一个位积(公式中的Pf + yn - i | x | )就累加到寄存器中,然后逻辑右移一位(公式中的2-1)得到新的P值
例:
| 部分积 | 乘数 | y | (部分积右移掉的数为1 就在乘数前面补1,为0补0) |
说明 |
|---|---|---|
| 00.00000 + 00.11111 |
11101 | y5 = 1, + |x| P0 = 0 |
| 00.11111 → 00.01111 + 00.00000 |
11101 11110 |
y4 = 0, + 0, 右移一位得P1 |
| 00.01111 → 00.00111 + 00.11111 |
11110 11111 |
y3 = 1, + |x| 右移一位得P2 |
| 01.00110 → 00.10011 + 00.11111 |
11111 01111 |
y2 = 1, + |x| 右移一位得P3 |
| 01.10010 → 00.11001 + 00.11111 |
01111 00111 |
y1 = 1, + |x| 右移一位得P4 |
| 01.11000 → 00.11100 |
00111 00011 |
右移一位得P5 |
符号位 Pf = x0 ⊕ y0 = 1
所以 [ x * y ]原 = 1.1110000011
x * y = - 0.1110000011
从上例可知:
两个n位数参加乘法运算要进行n次加法n次位移操作
加法运算可能会产生局部溢出,如上表中加粗的“ 1 ”,注意在进行逻辑右移操作时要将进位位移如部分积的最高位(不是补0)
例:
正常时00.01111进行逻辑右移后为00.00111,但01.10010右移后为00.11001