Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
9_ЛР_КА_2КСМ_2016-17.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
218.11 Кб
Скачать

1.2 Виконання алгебрачної операцiї дiлення чисел у сучасних комп`ютерах без вiдновлення залишкiв

Будем рассматривать двоичное деление целых чисел как основу для деления произвольных чисел, включая дроби. В выражении A / B = C делимым будем называть A, делителем - B, частным - C.

Рассмотрим вначале традиционный алгоритм деления:

- делитель сдвигается влево к старшему разряду делимого;

- на каждом шаге из делимого вычитается делитель, помноженный на цифру частного (данная цифра подбирается так, чтобы при вычитании получилось наименьшее неотрицательное число);

- остаток от вычитания принимается за делимое.

В случае двоичной системы счисления, очередная цифра частного получается из сравнения делимого и делителя, которое производится путем вычитания из делимого регистра делителя.

Если делимое больше делителя (их разность больше нуля), то: цифра частного принимается равной 0; делимое после сравнения восстанавливают, прибавляя к нему регистр делителя. Если делимое меньше делителя (их разность меньше нуля), то цифра частного принимается равной единице.

Далее делитель сдвигается вправо на один разряд, и операция продолжается еще n раз. Всего операция сравнения производится (n+1) раз.

Машинный алгоритм данного метода деления в применении к двоичным числам представлен ниже.

Исходные данные алгоритма деления с восстановлением остатка и сдвигом делителя вправо: делимое находится в регистре делимого; делитель находится в регистре делителя; ноль находится в регистре частного.

Этап 1. Сдвигаем делитель влево, пока он не станет больше делимого или пока не совпадут их старшие цифры, обозначив число сдвигов через n.

Этап 2. Сравниваем делимое и делитель. Операция сравнения призво-дится с помощью вычитания, а результат заносится в регистр делимого.

Если при вычитании из делимого делителя не было заема (делимое больше делителя), то заносим в регистр частного 1 и переходим к пункту 4.

Если при вычитании из делимого делителя получился заем (делимое меньше делителя), то вдвигаем в регистр частного справа цифру ноль.

Этап 3. Восстанавливаем отрицательный остаток в регистре делимого до состояния перед сравнением в пункте 2, прибавляя значение делителя к регистру делимого (на шаге 2 при сравнении производилось вычитание).

Этап 4. Сдвигаем делитель вправо на один разряд. Если еще не была выполнена (n+1) итерация, то переходим к пункту 2.

В итоге действия приведенного алгоритма: в регистре частного сфор-мируется значение частого, в регистре делимого - значение остатка.

Рассмотрим пример применения алгоритма деления с восстановлением остатка и сдвигом делителя вправо для чисел 110102 (делимое) и 1012 (делитель), результатом действия которого является частное 101 и остаток 1:

п/п

Шаг алгоритма

Регистр делимого

Регистр делителя

Регистр частного

1

Инициализация исходных данных

011010

000101

000000

2

Сдвиг делителя до совпадения старших цифр

011010

010100

000000

3

Сравнение делимого и делителя

000110

010100

000001

4

Сдвиг делителя

000110

001010

000001

5

Сравнение делимого и делителя

111100

001010

000010

6

Восстановление остатка

000110

001010

000010

7

Сдвиг делителя

000110

000101

000010

8

Сравнение делимого и делителя

000001

001010

000101

Существуют и другие схемы деления.

Например, оптимизируем предыдущий алгоритм.

Пусть Ai - остаток на i-том шаге (после i-того сравнения), B - исходный делитель.

Рассмотрим случай восстановления остатка Ai+1 = Ai + B*2n-i - B*2n-i-1,

где сложение соответствует восстановлению остатка, вычитание - i+1-му сравнению.

Очевидно, что восстановление производить необязательно: Ai+1 = Ai + B*2n-i-1. Достаточно на следующем шаге вместо операции вычитания при сравнении применить сложение.

Данный алгоритм получил название алгоритма деления без восстановления остатков.

Кроме того, вместо сдвига делителя вправо можно производить сдвиг делимого влево.

При этом, если выдвигемая старшая (знаковая) цифра равна 1, то в регистр частного вдвигается 0, и наоборот.

Ниже приведен широко распространенный алгоритм деления чисел без восстановления остатков на примере беззнаковых целых чисел (дроби приводят к правильному виду и отдельно рассматривается деление мантисс дробей как беззнаковых целых чисел).

Исходное состояние алгоритма: делимое находится в регистре суматора; делитель находится в регистре делителя; 0 находится в регистре частного.

Состояние устройства управления делением (УУД): n = 0 - в счетчике сдвигов; 1 - в разряде состояния.

Этап 1. Сдвигаем делитель влево до тех пор, пока старший после знакового разряд не станет равным 1.

Подсчитываем количество сдвигов в счетчике.

Если произошло переполнение счетчика, то имеет место деление на 0.

Этап 2. Если состояние равняется единице, то заполняем регистр делителя дополнением делителя, иначе - самим делителем.

Прибавляем делитель к делимому.

Этап 3. Сдвигаем делимое, инвертируем выдвинутую цифру устрой-ством обращения цифр (УОЦ) и вдвигаем эту цифру в регистр частного.

Состояние равняется вдвигаемой цифре.

Этап 4. Если выполнено (n+1) шагов, то переходим к шагу 5, иначе – переходим к шагу 2.

Этап 5. Сдвигаем сумматор вправо на 1 разряд.

Этап 6. Если состояние равняется нулю, то остаток необходимо восстановить, присуммировав делитель к делимому.

Этап 7. Сдвигаем остаток на n разрядов вправо, уменьшая счетчик.

Рассмотрим пример применения алгоритма деления без восстановления остатков для чисел 110102 (делимое) и 1012 (делитель), результатом действия которого является частное 101 и остаток 1:

п/п

Шаг алгоритма

Регистр делимого

Регистр велителя

Регистр частного

1

Инициализация исходных данных

011010

000101

0000000

2

Cдвиг делителя до совпадения старших цифр

011010

010100

0000000

3

Cравнение

000110

010100

000001

4

Cдвиг делителя

000110

001010

000001

5

Cравнение

111100

001010

000010

6

Cдвиг делителя

111100

000101

000010

7

Cравнение путем сложения

000001

001010

000101

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]