- •Лабораторна робота 9
- •1 Основні теоретичні відомості
- •1.1 Виконання алгебрачної операцiї дiлення чисел у сучасних комп`ютерах iз вiдновленням залишкiв
- •1.1.1 Формальні основи визначення поточної цифри частки при діленні чисел iз відновленням залишків
- •1.1.2 Алгоритм реалiзацiї дiлення чисел iз вiдновленням залишкiв
- •1.2 Виконання алгебрачної операцiї дiлення чисел у сучасних комп`ютерах без вiдновлення залишкiв
- •2 Контрольні питання
- •Вимоги до оформлення, захисту та оцінювання лабораторних робіт
- •Зразок оформлення титульного аркуша
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 |
