Целочисленное деление без восстановления остатка
Алгоритм без восстановления остатка разработаем, опираясь на рассмотренный алгоритм с восстановлением остатка.
Пусть после шага 4.1 алгоритма 6.5 имеем текущее значения остатка Ai, делитель Bi и очередная цифра частного равна 0, что означает необходимость выполнения шага восстановления остатка. При этих условиях заметим особенности последующих шагов выполнения алгоритма.
1. Восстановление остатка связано с выполнением операции
Ai+1:= Ai + Bi. (6.15)
2. Операции B:=R1(0· B) и D:= R1(1· D) шага 4.5 алгоритма приводят к уменьшению значения делителя в 2 раза. То есть, на этом шаге
Bi+1:= Bi / 2 (6.16)
3. На следующем цикле вычисления очередной цифры частного новое значение остатка на шаге 4.1 алгоритма будет вычисляться следующим образом:
Ai+2:= Ai+1 - Bi+1. (6.17)
Подставим в (1.50) выражения из (1.48) и (1.49):
Ai+2:= Ai + Bi - Bi / 2. (6.18)
Получим:
Ai+2 = Ai + Bi / 2= Ai + Bi+1. (6.19)
Таким образом, выражение (6.19) показывает, что очередное значение остатка Ai+2 может быть вычислено на основе остатка Ai без использования промежуточного значения Ai+1, то есть без выполнения шага восстановления остатка. С учетом этих наблюдений, модифицируем алгоритм 6.5.
Алгоритм 6.6. Целочисленноеделение без восстановления остатка со сдвигом делителя вправо.
Постановку задачи и обозначения примем как в алгоритме 6.5.
1. Подготовка переменных:
1.1. C:= 0 (- задание начального значения кода частного)
1.2. i:= 0 (- задание начального значения величины сдвига делителя)
|
|
1.3. p:= 1 (- подготовка условий для первого уменьшения делимого)
2. Начальный сдвиг кода делителя
2.1. Если bn-1 =0, топерейти к 2.2, иначеперейти к 3
2.2. Сдвиг кода делителя влево на 1 разряд с целью удаления из РС делителя незначащего нуля:
B:= L1(B· 0); (- сдвиг кода делителя влево на 1 разряд)
i:= i+1; (- код делителя сдвинут влево еще на один разряд)
2.3. Перейти к 2.1
3. D:= nota(B)+1; (- формирование цифровой части от (-B)ДК)
4. Цикл формирования кода частного:
4.1. Если p = 0, то A:= A+B (- это увеличение остатка);
иначе A:= A+D (- это уменьшение остатка);
(При суммировании кодов в обоих случаях фиксируем значение переноса p из старшего разряда разрядной сетки)
4.2. C:= L1(C· p)
4.3. Сдвиг кодов B и D делителя вправо на 1 разряд:
B:= R1(0· B); D:= R1(1· D)
4.4. Если i = 0, топерейти к 5
4.5. i:= i -1
4.6. Перейти к 4.1
5. Конец алгоритма (Код C задает искомый результат: A div B)
Дата добавления: 2016-01-04; просмотров: 11; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!