Алгоритм действий над порядками
1) Прием из ОЗУ порядков a и b;
2) Сравнение порядков r = a - b ;
3) Выравнивание порядков чисел
если r ≥ 0 ( a ³ b ) , то сдвиг B на |r | разрядов вправо , c = a;
иначе ( a < b ) сдвиг A на |r | разрядов влево , c = b.
Преобразование параллельного кода разности порядков в число-импульсный код ( количество сдвигов ) можно осуществить с помощью реверсивного счетчика.
4) при нормализации мантисс одновременно корректируется
порядок результата. Если выполняется сдвиг вправо, то с=с+1.
При сдвиге мантиссы влево на каждый сдвиг производится с=с-1.
Соответствующие сигналы поступают из АЛУ мантисс.
Алгоритм действий над мантиссами
1) Прием мантисс A и B из ОЗУ ;
2) Выравнивание порядков за счет того, что мантисса меньшего числа сдвигается вправо на количество разрядов, равное | z |.
3) Находится S = A ± B ;
4) Выполняется нормализация мантиссы результата. Если
| S| > 1, то сдвиг вправо S на один разряд , c=c + 1
иначе сч. сдв=0
М1: если | S| < 2-1 , то сдвиг влево S на один разряд S:=S × 2-1
и коррекция порядка c=c – 1, иначе | S | ≥ 2-1 и переход к М2,
иначе если сч.сдв ≥ n , то S = 0 и переход к М2,
иначе переход к М1.
М2: выдача в ОЗУ мантиссы S и порядка с, конец.
Пример вычисления для двоичных чисел
Будем вычислять γ = α + β
α = – . 10001 · 10 010 β = . 11110 · 10 001
Примем, что действия над порядками выполняются по алгоритму
ПП, а над мантиссами – по алгоритму ПД ( см. раздел 3 ).
|
|
1) Выполняем операции над порядками чисел:
[a] п = 0.010 [b] п = 0.001 r = |a| – |b| = . 0 1 0
– . 0 0 1
. 0 0 1
Так как заем из старшего разряда z0 = 0, то r ≥ 0 , а так как
ЗНr = 0, то |a| ≥ |b| , разность порядков r = .001.
Следовательно, α > β, и порядок результата [c]п=[a]п = 0.010.
Для выравнивания порядков нужно сдвигать вправо мантиссу
меньшего числа β.
2) Действия над мантиссами.
[A]п = 1.10001 [В]п = 0.11110
Сдвигаем вправо мантиссу В, получаем [В]п 2-1 = 0.01111
В соответствии с используемым алгоритмом ПД находим DМ.
Так как D =0 , ЗНA = 1 , ЗНB = 0 , то DМ =1. Следовательно,
должно быть выполнено вычитание модулей с использованием
дополнительного кода. Находим псевдосумму в виде
S* = [| A |]п + [-| B|]д = 1 0 0 0 1
+ 1 0 0 0 1
1.0 0 0 1 0
Как видно, вышла за пределы разрядной сетки единица переноса
P0 = 1, это означает, что S* > 0 и |S| =. 0 0 0 1 0
Для нормализации выполняем сдвиг влево на три разряда
|S| = . 1 0 0 0 0 , одновременно корректируется порядок
с = с – 0 1 1 = - 0 0 1
Определим знак мантиссы. Так как |А| > |В|, то ЗНS = ЗНА = 1.
|
|
Окончательный результат
γ = . 1 0 0 0 0 · 1 0-001
Умножение двоичных чисел
Существуют две основных группы алгоритмов умножения:
1) умножение в прямых кодах
2) умножение в дополнительных кодах.
Умножение в прямых кодах целесообразно использовать, когда числа в памяти хранятся в прямых или обратных кодах. Вторая группа алгоритмов применяется, если числа в памяти хранятся в дополнительных кодах.
Рассмотрим операции двоичного умножения в прямых кодах для чисел с фиксированной запятой. Будем вычислять:
С=А*В; |A|<1; |B|<1; A≠0; B≠0.
|B| = b1*2-1+ b2*2-2+ b3*2-3+...............+ bn*2-n
|C| = |A|*( b1*2-1+ b2*2-2+ b3*2-3+...............+ bn*2-n)
Знаки, как правило, непосредственно в операции умножения не участвуют и знак произведения определяется логическим путем.
Если ЗНА = ЗНВ то ЗНС = 0 , иначе ЗНС = 1
Для простоты изложения будем считать, что сомножители положительны и в дальнейших выкладках значок модуля не будет употребляться. В общем случае произведение может быть записано в виде суммы частных произведений. Как правило, принимается С0 = 0.
С= С0+С1+С2+...............+Сn
На каждом шаге умножения вычисляется очередная сумма частных произведений, которую обозначим Si. Так при умножении от старших разрядов множителя первая сумма частных произведений будет
|
|
S1=C0 + C1 и т.д.
При выполнении операции умножения всего возможны четыре алгоритма:
— умножение от младших разрядов множителя со сдвигом множимого влево;
— умножение от младших разрядов множителя со сдвигом суммы частных произведений вправо;
— умножение от старших разрядов множителя со сдвигом множимого вправо;
— умножение от старших разрядов множителя со сдвигом суммы частных произведений влево.
Реализация этих алгоритмов приводит к построению вариантов АЛУ, различающихся по аппаратурным затратам и быстродействию. Наиболее употребительными являются второй и третий алгоритмы.
Умножение от младших разрядов множителя со сдвигом суммы частных произведений вправо
Отметим основные особенности алгоритма:
1) К началу умножения числа в регистрах АЛУ должны быть представлены в прямых кодах.
2) Операция умножения выполняется над модулями чисел.
3) Умножение начинается от младших разрядов множителя, т.е. в первом такте вычисляется Cn = | А |*bn и далее сдвиг вправо.
4) В каждом такте после определния очередой суммы частных произведений она сдвигается на один разряд вправо.
|
|
5) Знак произведения находится логическим способом.
Рассмотрим числовой пример, и на этой основе разработаем машинный алгоритм
А=3/8; B=5/8; Найти С=A * B; C=15 / 64;
Запишем в двоичном коде: [A]п = 0.011; [B]п = 0.101; [C]п = 0.001111
Все алгоритмы умножения являются циклическими, поэтому
В машинных алгоритмах для подсчета числа циклов вводиться счет-
Чик сдвигов. Перед началом умножения в счетчик заносится нуль.
A= .011
B= .101
.000000 С0=0
Cч сдв=0 + .011 А* b3
.011000 С0 + A * b3= С0 + С1
Cч сдв=1 .001100 (С0+ С1)*2-1= S1
+.000 А* b2
.001100 S1 +А* b2
Cч сдв=2 .000110 (S1 +А* b2)*2-1=S2
+.011 А* b1
.011110 ((С0+ А* b3)*2-1 +А* b2))*2-1 +А* b1
Cч сдв=3 .001111 (((С0+ А* b3)*2-1 +А* b2))*2-1 +А* b1)*2-1 =S3
В нашем примере n=3, поэтому умножение закончено и в последней строке примера находится искомое произведение
S3 = |C| = .001111 = 15/64.
В результате произведенного анализа можно записать следующее рекурентное соотношение, в соответствии с которым выполняются действия в каждом такте умножения при вычислении очередной частичной суммы
Si=(Si-1+ А* bn-i+1)*2-1
При использовании этого алгоритма, возможно получение произведения с двойной точностью. Если достаточно получить произведение с одинарной точностью, то после окончания всех тактов умножения необходимо выполнить округление. При этом число разрядов в сумматоре регистра результата должно равняться (n+1).
Время умножения в прямых кодах в общем случае определяется следующим выражением:
Тумн.пк=n*( tсдв+ tсл), где t сдв – время выполнения операции сдвиг,
t сл - время выполнения операции сложение.
tсдв — длительность сдвига, где
tсл — длительность операции сложения.
Дата добавления: 2018-05-12; просмотров: 557; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!