Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Теория цифровых автоматов. Учебное пособие
.pdf
81
.0 YX
( )
.02.02
11
n
доп
n
YXYX
3.8. Алгоритмы деления двоичных чисел с фиксированной запятой
Алгоритмы деления, реализуемые процессором, позволяют
определить цифры (разряды) частного путем выполнения одинаковых
действий на каждом шаге алгоритма. Деление в ЭВМ обычно сводится к
выполнению последовательности вычитаний делителя сначала из
делимого, а затем из образующихся в процессе деления частичных
остатков и их сдвига.
Различают алгоритмы деления с восстановлением и без
восстановления остатка отдельно для дробных и целых чисел. Связано это
с тем, что процессор с фиксированной запятой работает только с данными,
представленными либо только дробными, либо только целыми числами.
В алгоритме деления с восстановлением остатка используется
большее число операций сложения и вычитания, поэтому в ЭВМ, как
правило, используется алгоритм деления без восстановления остатка.
Z = X
пр : Yпр
.
Деление для компьютера является весьма трудной операцией.
В ЭВМ, оперирующих с дробными числами c фиксированной
запятой, деление дробных чисел возможно только при выполнении
условия: делимое по модулю меньше делителя. В противном случае
частное равно или больше единицы и выходит за пределы разрядной
сетки.
Условие возможности деления дробных чисел:
В ЭВМ, оперирующих с целыми числами c фиксированной запятой,
возникает необходимость представления делимого двойной разрядной
сеткой, т.е. 2n разрядами, делитель и частное имеют n разрядов со знаком.
Условие возможности деления целых чисел:

82
Перед началом деления делимое и делитель проверяются на
равенство нулю. Если обнаруживается нулевой операнд, то деление не
производится.
При X = 0 частное принимается равным нулю, при Y = 0
вырабатывается требование прерывания исполняемой программы, т. е.
остановки решения некорректно сформулированной задачи.
3.8.1. Алгоритм деления чисел в прямом коде с восстановлением
остатка
1. Берутся модули от делимого /X/ и делителя /Y/. Модуль
делимого заносится в сумматор Sm, а модуль делителя – в RG
А. Знаковые разряды хранятся отдельно в триггерах.
2. Проверка на возможность выполнения операции деления. Из
делимого вычитается делитель, если результат Z0≥0, то частное
переполняет разрядную сетку и деление в ЭВМ с
фиксированной запятой в этом случае невозможно. Если Z<0,
то переполнения нет. Деление также невозможно, если /Y/=0
(делитель равен нулю).
3. Исходное значение частичного остатка (О0) полагается равным
делимому.
4. Частичный остаток Оi удваивается сдвигом влево на один
разряд.
5. Из сдвинутого частичного остатка Оi вычитается делитель и
анализируется знак полученного результата.
6. Если полученный остаток Оi≥0, то очередной цифре частного
присваивается значение «1» , если полученный остаток меньше
нуля (Оi<0), то очередной цифре частного присваивается
значение «0». В последнем случае значение остатка
восстанавливается до того, каким оно было до последнего
вычитания. С этой целью к остатку прибавляется модуль
делителя /Y/.
7. Пункты 4-6 последовательно выполняются до получения
требуемого количества цифр частного.
8. Частному Z присваивается знак как «сумма по модулю 2»
знаков операндов X и Y: Sign Z = Sign X Sign Y.

83
( )
.0
доп
BA
2
-
1
2
-
2
2
-
3
2
-
4
+
0 1 1 0 1
А
1 1 0 1 0
(– В)
доп
0 0 1 1 1 Z > 0.
Пример 11. Деление с восстановлением остатка Z
обр
= А
обр
: B
обр
.
Заданы следующие дробные числа:
Апр = 01101; В
= 10110.
пр
Возьмём модули заданных чисел:
│Апр│ = 01101; │Впр│ = 00110.
Теперь рассмотрим сам механизм деления чисел.
1. Перед началом деления делимое и делитель проверяем на
равенство нулю. Ни делитель, ни делимое нулю не равны, поэтому
переходим к следующему этапу.
2. Проверка на корректность деления (на возможность деления).
Условие возможности деления:
(– В)
=11010. Выполним проверку.
доп
Делить нельзя, так как остаток, полученный после вычитания,
положителен (Z > 0). То есть получается, что поскольку числа А и В
дробные, то и результат Z тоже должен быть дробным, а это возможно,
если |А|<|В|.
Пример 12. Деление с восстановлением остатка Zпр = Апр : Bпр.
Заданы следующие числа: А = 0,1011 и В = - 0,1101.
Апр = 01011; В
= 11101.
пр
Возьмём модули заданных чисел:
│Апр│ = 01011; │Впр│ = 01101.
[│– В│]
= 10011.
доп
Для обнаружения переполнения вычитаем из делимого делитель:

84
,
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
0 1 1 0 1 1
Z0 < 0 .
L1(S)
S
1 1 1 1 0
0 1 1 0 1
0 1 0 1 1
1 0 1 1 0
1 0 0 1 1
0 1 0 0 1
S
1 0 0 1 0
1 0 0 1 1
0 0 1 0 1
L1(S)
S
0 1 0 1 0
1 0 0 1 1
1 1 0 1
0 1 1 0 1
0 1 0 1 0
1 0 1 0 0
1 0 0 1 1
0 0 1 1 1
0 1 1 1 0
1 0 0 1 1
0 0 0 0 1
L1(S)
1
S
L1(S)
S
L1(S)
S
0 1011
1 0011
1 1110,
Так как Z0 < 0, то переполнение отсутствует, следовательно, можно
выполнять операцию деления. Реализацию операции деления можно
увидеть на рис. 18.
Рис. 18. Пример деления чисел в прямом коде с восстановлением остатка
Результат получен в прямом коде: Zпр = 1.11011

85
Содержательная ГСА деления чисел в прямом коде с
восстановлением остатка представлена на рис. 19.
Вершина 2. Здесь выполняется запись операндов /А/ и /В/ с шин Х и
Y в Sm и RGA. Регистру RGB присваивается нулевое значение.
Вершина 3. Анализируется содержимое RGА на равенство нулю.
Если RGА=0, то операцию деления невозможно выполнить.
Осуществляется переход к вершине 7. Если RGA ≠ 0, то переходим к
вершине 4.
Вершина 4. Проверка на возможность выполнения операции
деления. К содержимому сумматора Sm прибавляется значение [-RGА]
доп
.
Вершина 5. Выполняется анализ знакового разряда сумматора. Если
SignSm=0, то произошло переполнение разрядной сетки и осуществляется
переход к вершине 7. Если SignSm=1, то переходим к вершине 6.
Вершина 6. Восстанавливается остаток О0. Для этого в сумматор Sm
записывается содержимое RGA. Счетчик циклов устанавливается в «n».
Частичный остаток Оi удваивается сдвигом влево на один разряд
[Sm:=L1(Sm)].
Вершина 7. Установка триггера переполнения в единичное
состояние. Переход к вершине 20 (конец выполнения алгоритма).
Вершина 8. Из сумматора вычитается содержимое RGA.
Вершина 9. В старший разряд RGB записывается инверсное
значение знака Sm.
Вершина 10. Значение Sm сдвигается влево на 1 разряд.
Вершина 11. Анализируется знаковый разряд сумматора. Если
signSm=1, то переход на вершину 12. Если signSm=0, то переход к
вершине 13.
Вершина 12. К содержимому сумматора прибавляется значение
RGA.
Вершина 13. Содержимое RGB сдвигается влево на 1 разряд.
Инкрементируется содержимое счетчика на «1».
Вершина 14. Содержимое RGB сдвигается влево на 1 разряд.
Вершина 15. Анализируется содержимое счетчика на равенство «0».
Если СТ ≠ 0, то возвращаемся на вершину 14.
Вершина 16. Если СТ=0, то в сумматор записывается значение RGB.

86
S: =
RG : =
RG : = 0
RG = 0
S:=S+[-RG A]
sign Sм=1
S: = RG
= n
S:=L1(S)
1
0
1
0
: = 1
RG В[n]: = sign Sм
S:=S+[-RG A]
S:= S+RG
= 0
sign S=1
S: = RG
: = -1
sign S: = 1
1
1
10
0
0
Y
5
sign Z: = sign Sм
RG B:= L1(RG B)
RG B:= L1(RG B)
sign X + sign У = 1
S:=L1(S)
10
11
12
13
14
15
16
17
18
19
20
9
8
6
5
7
4
3
2
1
Рис. 19. ГСА операции деления в прямых кодах для чисел с
фиксированной запятой с восстановлением остатка

87
Вершина 17. Здесь анализируется SignX и SignY. Если они
совпадают, то переход к вершине 19, если не совпадают, то к вершине 18.
Вершина 18. Знаку сумматора присваивается значение «1».
Вершина 19. Знак результата равен знаку сумматора.
3.8.2. Алгоритм деления чисел в прямом коде без восстановления
остатка
1. Берутся модули от делимого
Sм:=
, RG У:=
.
и делителя
2. Проверяем возможность деления. Из делимого вычитается
делитель, если остаток Z0≥0, то частное ≥1 и деление невозможно
(возникает переполнение). Деление также невозможно, если
=0 (делитель равен 0).
3. Остаток удваивается сдвигом влево на 1 разряд.
4. Если остаток положителен, то делитель вычитается из остатка,
если отрицателен, то делитель суммируется с остатком.
5. Если вновь полученный остаток положителен, то очередная
цифра частного равна «1», если остаток отрицателен, цифра
частного равна «0».
6. Пункты 3-5 до выработки требуемого числа цифр частного.
7. Частному присваивается знак «плюс», если знаки операндов
одинаковы, и знак «минус», если знаки операндов разные.
Пример 13. Выполнить деление без восстановления остатка
Zпр = Апр : Bпр.
Заданы следующие числа: А = 0,1011 и В = - 0,1101.
Возьмём модули заданных чисел:
Для обнаружения переполнения вычитаем из делимого делитель:
Апр = 01011; В
= 11101.
пр
│Апр│ = 01011; │Впр│ = 01101.
[– В]
= 10011.
доп
0 1011
1 0011
1 1110.

88
0 1 1 0 1 1
1 1 1 0 0
0 1 1 0 1
0 1 0 0 1
1 0 0 1 0
1 0 0 1 1
0 0 1 0 1
0 1 0 1 0
1 0 0 1 1
1 1 1 0 1
1 1 0 1 0
0 1 1 0 1
0 0 1 1 1
0 1 1 1 0
1 0 0 1 1
0 0 0 0 1
Z0 < 0
L1(S)
L1(S)
L1(S)
L1(S)
L1(S)
S
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
Частное
Так как Z0 < 0, то переполнение отсутствует, следовательно, можно
выполнять операцию деления. Реализацию операции деления можно
увидеть на рис. 20.
Рис. 20. Пример деления чисел в прямом коде без восстановления остатка
Результат получается в прямом коде: Zпр = 1.11011
.
Содержательная ГСА деления в прямом коде без восстановления
остатка для чисел с фиксированной запятой (рис. 21).
Пояснения к рис. 21.

89
Вершина 2. Здесь выполняется запись операндов /А/ и /В/ с шин Х и
Y в Sm и RGA. Регистру RGB присваивается нулевое значение.
Вершина 3. Анализируется содержимое RGА на равенство нулю.
Если RGА=0, то операцию деления невозможно выполнить.
Осуществляется переход к вершине 7. Если RGA ≠ 0, то переходим к
вершине 4.
Вершина 4. Проверка на возможность выполнения операции
деления. К содержимому сумматора Sm прибавляется значение [-RGА]
доп
.
Вершина 5. Выполняется анализ знакового разряда сумматора. Если
SignSm=0, то произошло переполнение разрядной сетки и осуществляется
переход к вершине 7. Если SignSm=1, то переходим к вершине 6.
Вершина 6. Счетчик циклов устанавливается в «n». Частичный
остаток Оi удваивается сдвигом влево на один разряд [Sm:=L1(Sm)].
Вершина 7. Установка триггера переполнения в единичное
состояние. Переход к вершине 20 (конец выполнения алгоритма).
Вершина 8. Анализируется знаковый разряд сумматора. Если
signSm=1, то переход на вершину 10. Если signSm=0, то переход к
вершине 9.
Вершина 9. Из сумматора вычитается содержимое RGA.
Вершина 10. К содержимому сумматора прибавляется значение
RGA.
Вершина 11. В старший разряд RGB записывается инверсное
значение знака Sm. Содержимое RGB сдвигается влево на 1 разряд.
Значение Sm сдвигается влево на 1 разряд. Значение счетчика
уменьшается на «1».
Вершина 12. Анализируется содержимое счетчика на равенство «0».
Если СТ ≠ 0, то возвращаемся на вершину 8.
Вершина 13. Если СТ=0, то в сумматор записывается значение RGB.
Вершина 14. Здесь анализируется SignX и SignY. Если они
совпадают, то переход к вершине 16, если не совпадают, то к вершине 15.
Вершина 15. Знаку сумматора присваивается значение «1».
Вершина 16. На шину Z выставляется содержимое сумматора.

90
Sм: = Х
RG А: = У
RG В: = 0
RG = 0
S:=S+[-RG A]
sign SМ=1
S:=L1(S)
= n
: = -1
sign X + sign У = 1
1
0
1
0
: = 1
0
RG В[n]:=
sign Sм
sign SМ=1
10
S:=S+[-RG A]
S:=L1(S)
RG В: = L1(RG В)
= 0
1
0
sign S: = 1
1
Z: = Sм
SМ: = SМ + RG А
Sм: = RG В
10
11
12
13
14
15
16
17
9
8
6
7
5
4
3
2
1
Рис. 21. ГСА операции деления в прямых кодах для чисел с
фиксированной запятой без восстановления остатка
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
