Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теория цифровых автоматов. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
81
.0YX
( )
.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. ГСА операции деления в прямых кодах для чисел с
фиксированной запятой без восстановления остатка
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]