Алгоритм действий над  порядками



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.    

    С= С012+...............+С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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!