30 Операции над числами с фиксированной точкой. Алгоритмы. Реализация. (1006351), страница 2
Текст из файла (страница 2)
Необходимо также иметь счетчик циклов Сч.Ц, сначала устанавливается «n», далее работает на вычитание. Если Сч.Ц=0, то прекращается умножение.
Микропрограмма умножения
Р1:=Швх; (множимое)
Р2:=Швх; РВ:=0; (множитель)
СчЦ:=n;
ТЗ:=Р1[0]+P2[0];
P1[0]:=0;
P2[0]:=0;
┌──────────────────────────────┐
│ "1" ┌─────┴──────┐ "0"
│ ┌─────────┤ Р2[n-1] ├─────────┐
│ ┌─────┴─────┐ └────────────┘ ┌─────┴─────┐
│ │ РA:=Р1 │ │ РA:=0 │
│ └─────┬─────┘ └─────┬─────┘
│ └───────────────┬────────────────┘
│ ┌─────────────┴──────────────┐
│ │ СM:=РA+РB │
│ │ РC:=П(1)СM │
│ │ Р3:=П(1)Р2 │
│ │ Р3[0]:=СM[n-1] │
│ └─────────────┬──────────────┘
│ ┌─────┴──────┐
│ │ РB:=РC │
│ └─────┬──────┘
│ ┌─────────────┴──────────────┐
│ │ Р2:=Р3 │
│ │ СчЦ:=СчЦ-1 │
│ └─────────────┬──────────────┘
│ нет ┌───┴───┐ да
└──────────────────────────┤ СчЦ=0?├───────────────┐
└───────┘ │
РA:=0
РС:=РA+РB
PC[1-(n-1)]:=РA+РB
PC[0]=TЗ
Швых:=РС (старшая часть рез-та)
РA:=0
PB:=P2
PC:=PA+PB
Швых:=РС (младшая часть рез-та)
Умножение целых чисел, представленных в дополнительном коде
-
x0, y0
-
x0, y<0
=
=|x|(2 n-|y|)=2 n|x|-|x||y| - неправильный результат, обозначим его как а), правильный результат должен быть
=2 2n-|x||y|, обозначим его как в), поэтому необходимо скорректировать результат:
т.е. надо из в) вычесть а), тогда а) - в) =2 2n-2 n |x|=2 n (2 n - |x|) = с), т.е. это мы получили дополнительный код множимого - x, сдвинутый на n-разрядов влево. Чтобы получить правильный результат нужно к результату прибавить доп код множимого, сдвинутый на n разрядов влево
Пример:
X=3
Y=-5
0011
*1011
0011
00011
+0011
01001
001001
0001001
+ 0011
0100001
00100001
+ 1101
11110001 – доп код -15
-
x<0, y>0
=
=(2 n - |x|) |y|= 2 n |y| |x||y|+(2 2n – 2 n |y|), а должно быть
2 n (2 n- |y|)- дополнит. код множителя,
2 2n –2 n |y| -коррекция.
Чтобы получить правильный результат нужно к результату прибавить доп код множителя, сдвинутый на n разрядов влево
4) x<0, y<0
=
=(2 n - |x|) (2 n - |y|)=2 2n – 2 n |y| - 2n |x| + |x||y| = а)- неправильный результат, должно быть
= |x||y|.
|x|- дополнительный код множимого сдвинутый на разряд влево т.е.
|x|=2 n (2 n - |x|),
|y|- дополнительный код множителя
Правильный результат будет, если к а) прибавить дополнит. код множимого и множителя, сдвинутых на n разрядов влево.
Правило:
-
Умножение производится обычным образом.
-
Если множитель отрицательный (y<0), то необходимо прибавить дополнит. код множимого -x.
-
Если множимое отрицательное (x<0), то необходимо прибавить дополнит. код множителя -y.
-
Если множимое и множитель отрицательны (x<0, y<0), то необходимо прибавить дополнит. код множимого и дополнительный код множителя.
Микропрограмма и схема АЛУ для выполнения операции умножения в дополнительном коде
РА -множимое,
Рг2- множитель, младшая часть,
РВ -старшая часть множимого.
3 Ускоренное выполнение операции умножения
Существует два основных подхода:
-
аппаратные методы ускоренного умножения -АМ;
-
логические методы умножения- ЛМ.
АМ и ЛМ требуют дополнительного оборудования. При использовании ЛМ дополнительное оборудование не зависит от длины-n сомножителя, а при АМ - зависит.
Логические методы - метод Лемана.
Метод Лемана позволяет уменьшить число необходимых сложений путем анализа нескольких разрядов множитля одновременно.
Когда единицы и нули чередуются следующим образом - 01010101 -то метод Лемана не работает.
Таблица действий при анализе двух разрядов:
| кор | bi | bi+1 | действие | кор |
| 0 | 0 | 0 | П(2) r | 0 |
| 0 | 0 | 1 | П(2) (r+М) | 0 |
| 0 | 1 | 0 | П(2) (r+2М) | 0 |
| 0 | 1 | 1 | П(2)(r-М) | 1 |
| 1 | 0 | 0 | П(2) (r+М) | 0 |
| 1 | 0 | 1 | П(2) (r+2М) | 0 |
| 1 | 1 | 0 | П(2)(r-М) | 1 |
| 1 | 1 | 1 | П(2) r | 1 |
П(2) – сдвиг вправо, r-промежуточный результат, М-множимое
Соотношения, описывающие метод Лемана:
0, не надо выполнять операцию «+» и «-» на i шаге умножения
di=
1, надо выполнять операцию «+» и «-» на i шаге умножения
0, надо выполнять операцию «+», если di =1
Si=
1, надо выполнять операцию «-», если di =1
Пусть bj – j разряд множителя.
Si= bi+1•di
Аппаратные методы ускорения операции умножения.
Объем оборудования зависит от числа разрядов.
4 Деление.
Рассмотрим деление 2 способами:
-
с восстановлением остатка
-
без восстановления
Разрядная сетка для целых чисел ограниченна: z = xy.
деление обр. операции для умножения;
z, y – выделяется по n разрядов, а (x) – 2n.
Можно делить (x) на y в том случае, когда z < 2n-1 .
Правило переполнения для частного.
z = xy, пусть x, y 0, целые представленные в прямом коде.
z < 2n-1 ; xy < 2n-1; x < y2n-1; x - y2n-1 < 0 правило возможности выполнения операции.
Д
о деления осуществляется пробное вычитание, если величина оказалась 0, то переполнение, если < 0 – можно делить.
x
2n
y2n-1
Деление с восстановлением остатка.
Алгоритм:
-
Образуем знак частного: складываем по модулю 2 знаковые разряды делимого и делителя.
-
Знаковые разряды делимого и делителя сбрасываем и сдвигаем делимое на один разряд влево.
-
К делимому прибавляем дополнительный код делителя, выровненный по левому краю и анализируется знак результата.
-
Если получили отрицательный текущий остаток, то восстанавливаем предыдущий остаток (прибавляем делитель в прямом коде) и сдвигаем его. В этом случае разряд частного получает значение 0.
-
Если получили положительный текущий остаток, то очередной разряд частного принимает значение 1 и этот положительный текущий остаток сдвигается влево
-
Повторяем пункты 3-5 до получения n разрядов частного
Недостатком этого способа является необходимость восстановления остатка.
В общем случае после деления имеем целую часть и остаток от деления.
Пример:
Деление без восстановления остатка.
Алгоритм:
1Образуем знак частного: складываем по модулю 2 знаковые разряды делимого и делителя.
2 Знаковые разряды делимого и делителя сбрасываем и сдвигаем делимое на один разряд влево.
3 К делимому прибавляем дополнительный код делителя, выровненный по левому краю и анализируется текущий остаток.
4 Если текущий остаток положительный, сдвигаем его влево на 1 разряд и вычитаем делитель
5 Если текущий остаток отрицательный, то сдвигаем его влево и прибавляем делитель
Пример:
Аппаратная реализация:
Р1-делитель
РВ – старшая часть делимого
Р2 – младшая часть делимого
СП-схема переноса - РС=СдвигВлево(См)
При первом способе деления :
при вычитании из текущего остатка делителя (РА=ИнверсияР1, СМ=РА+РВ+1) сохраняется предыдущий остаток и новый остаток. Если новый остаток отрицательный, то нужно взять сохраненный в РВ и Р2 предыдущий остаток и сдвинуть его. Если текущий остаток положительный, то сдвигаем его.
Разряды частного записываем в младщий разряд Р2
При втором способе:
Текущий остаток находится в РВ и Р2. От этого остатка требуется вычитать или складывать с ним делитель. Новый остаток всегда требуется сдвигать.
13













