Если числа в ЭВМ представлены в дополнительных кодах, то операцию умножения можно трактовать в общем виде следующим образом:
- если Х>0 и Y>0, то поскольку [Х>0]Д = Х, [Y>0]Д = Y, специфика выполнения умножения здесь не проявляется (см. гл.I. п.4.1);
- если Х<0, а Y>0, то [Х<0]Д = 2+Х и [Х]Д [Y]Д = 2Y + ХY – получается так называемое псевдопроизведение, и для того чтобы получить правильный результат [ХY<0]Д = 2+ХY, необходимо к псевдопроизведению прибавить 2 и вычесть 2Y;
- если Х>0, Y<0, то [Х]Д [Y]Д = 2Х+ХY, и здесь необходима поправка, равная +2 и -2Х;
- если Х<0 и Y<0, то [Х]Д [Y]Д = (2+Х)(2+Y), а правильный результат ХY, и необходима поправка - 4 - 2Х - 2Y.
Существует несколько способов введения поправок. Рассмотрим способ со сдвигом сумм частичных произведений вправо на примере умножения с младших разрядов множителя, обеспечивающий автоматическое введение поправок при любых знаках перемножаемых чисел. Обозначим дополнительный младший разряд множителя, на который производится умножение через y(n+1-i). По отношению к данному разряду старшим будет y(n‑i). Алгоритм вычисления заключается в следующем:
- если y(n+1-i) = y(n-i), то производится лишь сдвиг частичного произведения A(i-1)·2-1;
- если y(n-i) = 0, а y(n+1-i) = 1, то к A(i-1)·2-1 прибавляется [Х]Д;
- если y(n-i) = 1, а y(n+1-i) = 0, то из A(i-1)·2-1 вычитается [Х]Д или к A(i-1)·2-1 прибавляется [-(Х)Д]Д со сменой знака X.
Для этого алгоритма справедлива следующая рекуррентная формула
A(i) = A(i-1)·2-1 + [(у(n+1-i)-у(n-i))·(Х)]Д.
При этом операция состоит из n+1 такта для i=1,...,n+1. Другими словами, умножение производится и на знаковый разряд множителя y0. После умножения на последнем шаге получаем A(n+1) = [Х]Д [Y]Д = [Z]Д и сдвиг A(n+1) не производится.
Рассмотренная методика применима и к умножению со старших разрядов множителя со сдвигом множимого вправо. Алгоритм выполнения операции имеет следующий вид:
Умножим в дополнительном двоичном коде десятичные числа -5 и -6 с фиксированной запятой перед старшим разрядом:
Берем дополнительный разряд множителя y5=0 и вычисляем разность двух старших разрядов множителя на очередном шаге умножения при сдвиге влево с выполнением следующих микроопераций (м/о):
1) y1-y0=0, (A(0)=0)∙2-1
2) y2-y1=-1, A(1) +0.ХПР∙2-1
3) y3-y2=+1, A(2)+[-Х]Д∙2-2
4) y4-y3=-1, A(3)+(0.ХПР )∙2-3
5) y5-y4=0, [Z]Д = (A(4)+0)
С учетом сдвига множителя влево и сумм частичных произведений A(i) влево, и с учетом сдвига Х∙2-1 множимого вправо 1.1011 на каждом шаге умножения имеем:
Ш
а
г
Со сдвигом A(i) вправо
Со сдвигом Х вправо
ХПР
0.010100000
ХПР
0.010100000
[-Х]Д
1.101100000
[-Х]Д
1.101100000
м/о
Сумматор
м/о
Сумматор
(A(0)=0)∙2-1
0.000000000
(A(0)=0)+0
0.000000000
SM+0.ХПР
0.010100000
SM+(0.Хп)∙2-1
0.001010000
A(1)∙2-1
0.001010000
+[-Х]Д
1.101100000
+[-Х]Д∙2-2
1.111011000
SM+[-Х]Д
1.110110000
SM+[-Х]Д∙2-2
0.000101000
[A(2)]Д∙2-1
1.111011000
Ш
а
г
Со сдвигом A(i) вправо
Со сдвигом Х вправо
+0.Хпр
0.010100000
+(0.Хпр)∙2-3
0.000010100
SM+0.Хп
0.001111000
SM+(0.Хпр)∙2-3
0.000111100
A(3)∙2-1
0.000111100
[Z]Д=A(4)+0
0.000111100
[Z]Д=A(4)+0
0.000111100
Для проверки правильности вычислений умножим полученный результат 0.000111100 на коэффициент 2+8, получим +11110,0 = + (1∙24 + 1∙23 + 1∙22 + 1∙21) = + (16 + 8 + 4 + 2) = + 30. Заметим, что операция умножения со сдвигом сумм частичных произведений выполняется медленнее, чем со сдвигом множимого, так как микрооперации суммирования и сдвига не могут выполнятся одновременно в сумматоре.