
- •Глава I. Организация вычислений в эвм
- •1. Позиционные системы счисления
- •2. Алгоритмы перевода чисел из одной системы счисления в другую
- •3. Формы представления чисел в двоичной системе счисления
- •4. Операции сложения чисел в прямом, обратном и дополнительном кодах с фиксированной запятой
- •4.2. Умножение чисел в дополнительных кодах
- •4.3. Операция умножения над обратными кодами сомножителей
- •4.6. Выполнение операции сложения над числами с плавающей запятой
- •5. Форматы данных
- •6. Стадии выполнения команды и способы адресации
4.2. Умножение чисел в дополнительных кодах
Если числа в ЭВМ представлены в дополнительных кодах, то операцию умножения можно трактовать в общем виде следующим образом:
- если Х>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) не производится.
Рассмотренная методика применима и к умножению со старших разрядов множителя со сдвигом множимого вправо. Алгоритм выполнения операции имеет следующий вид:
[Х]Д [Y]Д = (у1-у0) [Х]Д + (у2-у1) [Х]Д ·2-1 + ...
+ (уn-уn-1) [Х]Д ·2-n+1 + (уn+1-уn) [Х]Д ·2-n.
Умножим в дополнительном двоичном коде десятичные числа-5 и -6 с фиксированной запятой перед старшим разрядом:
[-5]пр=1.0101, [-5]д=1.1011 (∙2+4,число дробное),
[-6]пр=1.0110, [-6]д=1.1010 (множительy0.y1y2y3y4∙2+4).
Берем дополнительный разряд множителя y5=0 и вычисляем разность двух старших разрядов множителя на очередном шаге умножения при сдвиге влево с выполнением следующих микроопераций (м/о):
y1-y0=0, (A(0)=0)∙2-1
y2-y1=-1, A(1) +0.ХПР∙2-1
y3-y2=+1, A(2)+[-Х]Д∙2-2
y4-y3=-1, A(3)+(0.ХПР )∙2-3
y5-y4=0, [Z]Д = (A(4)+0)
С учетом сдвига множителя влево и сумм частичных произведений A(i)влево, и с учетом сдвига Х∙2-1 множимого вправо 1.1011 на каждом шаге умножения имеем:
Ш а г |
Со сдвигом A(i) вправо |
|
Со сдвигом Хвправо | ||
ХПР |
0.010100000 |
ХПР |
0.010100000 | ||
[-Х]Д |
1.101100000 |
[-Х]Д |
1.101100000 | ||
м/о |
Сумматор |
м/о |
Сумматор | ||
1 |
(A(0)=0)∙2-1 |
0.000000000 |
(A(0)=0)+0 |
0.000000000 | |
2 |
SM+0.ХПР |
0.010100000 |
SM+(0.Хп)∙2-1 |
0.001010000 | |
A(1)∙2-1 |
0.001010000 |
| |||
3 |
+[-Х]Д |
1.101100000 |
+[-Х]Д∙2-2 |
1.111011000 | |
SM+[-Х]Д |
1.110110000 |
SM+[-Х]Д∙2-2 |
0.000101000 | ||
[A(2)]Д∙2-1 |
1.111011000 |
| |||
Ш а г |
Со сдвигом A(i) вправо |
|
Со сдвигом Хвправо | ||
4 |
+0.Хпр |
0.010100000 |
+(0.Хпр)∙2-3 |
0.000010100 | |
SM+0.Хп |
0.001111000 |
SM+(0.Хпр)∙2-3 |
0.000111100 | ||
A(3)∙2-1 |
0.000111100 |
| |||
5 |
[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. Заметим, что операция умножения со сдвигом сумм частичных произведений выполняется медленнее, чем со сдвигом множимого, так как микрооперации суммирования и сдвига не могут выполнятся одновременно в сумматоре.