Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Вычислительные машины_new.doc
Скачиваний:
64
Добавлен:
12.09.2019
Размер:
5.41 Mб
Скачать

Умножение чисел в дополнительных кодах

Если числа в ЭВМ представлены в дополнительных кодах, то операцию умножения можно трактовать в общем виде следующим образом:

- если Х>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. y1 y2 y3 y4∙2+4).

Берем дополнительный разряд множителя 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

м/о

Сумматор

м/о

Сумматор

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. Заметим, что операция умножения со сдвигом сумм частичных произведений выполняется медленнее, чем со сдвигом множимого, так как микрооперации суммирования и сдвига не могут выполнятся одновременно в сумматоре.