Главная Промышленная автоматика.

Поскольку предполагается, что на изменение масштаба (сдвиг двоичной запятой) время не тратится, мы можем с тем же успехом сказать, что "обратное" к числу i -это частное отделения2*"-1 на 1. В остальной части этого раздела термин "обратное" употребляется именно в этом смысле.

Сначала рассмотрим, как найти последовательные приближения к числу А = 1/Р, где Р - целое. Пусть At будет i-м приближением к 1/Р. Тогда точное значение А можно представить в виде

Л = Л, + (1/Р)(1-Л,Р). (8.1)

Если в (8.1) взять в качестве приближения к 1/Р число At, то получим формулу

= Л, + Л, (1 - Л,Р) = 2Л,-Л.Р, (8.2)

которую можно использовать для нахождения (»+1)-го приближения числа А по его t-му приближению. Заметим, что если AiP=\-S, то

Ai+iP = 2AiP - A)P = 2(1 -S) -(1 -S)" = 1 -S\

Это показывает, что итерация по формуле (8.2) дает квадратичную скорость сходимости. Если S<V2. то число правильных двоичных разрядов удваивается при каждой итерации.

Поскольку число Р предположительно содержит много двоичных разрядов, то для первых приближений не обязательно брать все его цифры, потому что на правильные цифры числа At+i влияют только старшие разряды в Р. Если в Ai первые k цифр справа от запятой верны, то 2k цифр числа Ai+i можно найти по формуле (8.2). Иными словами, для вычисления Ац.1=2А{-берем в 2Ai только k цифр справа от запятой и находим А\Р, используя 2-разрядное приближение числа Р и отбрасывая затем все разряды правее 2-го после запятой. Подобное использование приближенных значений может, конечно, повлиять на сходимость, так как ранее предполагалось, что число Р точно.

Применим эти соображения в алгоритме, вычисляющем частное 1 2="-1/Р J, где P=pi р2 • • • р„-это п-разрядное двоичное целое с pi=l. Метод по существу определяется формулой (8.2), к которой добавлено изменение масштаба (перенос запятой), чтобы можно было работать только с целыми числами. Таким образом, не надо заботиться о положении запятой.

Алгоритм 8.1. Обращение целых чисел

Вход, п-разрядное двоичное целое число P=lpi ра . . . Рп] с pi=l. Для удобства предполагаем,что п - степень числа 2, а [х] - целое число с двоичной записью л; (например, [110]=6).

Выход. Целое число Л = [001 • • . Onl. равное Л= 2*-VP J.

Метод. Вызываем ОБРАТНОЕ {[рра. . .р„]), где ОБРАТНОЕ - рекурсивная процедура, приведенная на рис. 8.1. Она вычисляет



procedure ОБРАТНОЕ ([pip,.. .р]):

1. if k=l then return [10] else

begin

2. [c„Ci.. .Cft/2]ОБРАТНОЕ {[рр,.. .р*/2]);

3. [did,.. Ak][CoCi • • • Cft/2j*23*/2-[Vi.. .Cft/2HPiP2- • -P*]; comment Хотя правая часть оператора в строке 3 служит для получения (2ft-f 1)-разрядного числа, стар-шик (2k+l)-vi разряд всегда равен нулю;

4. [flofli-

comment [apfli.. .fl;]-хорошее приближение к 2*"/[PiPj. . .pft]. Следующий цикл улучшает это приближение, прибавляя, если необходимо, трехзначное число к младшим разрядам;

5. for i*-2 step -1 until О do

6. if ([fl„fli.. .a,] + 2)*[p,p,.. .p,]<2«- then

7. [aofli...flj][fl„fli...aj] + 2";

8. return [flo«i- • -k] end

Рис. 8.1. Процедура для обращения целых чисел.

приближение KL2**"V[pi р,. . . pJ Jдля любого k, являющегося степенью числа 2. Заметим, что в результате обычно получается fe-разрядное число. Исключение составляет случай, когда Р - степень числа 2; здесь в результате получится (Л-М)-разрядное число.

По данным k битам числа, обратного к [pi р, . . . pl, строки 2-4 вычисляют 2k-3 битов числа, обратного к [pi р, . . . p,* . Строки 5-7 корректируют последние три бита. На практике можно было бы перескочить через строки 5-7 и получить нужную точность дополнительным применением формулы (8.2) в конце. Мы предпочли включить в программу цикл в строках 5-7, чтобы упростить понимание алгоритма и доказательство правильности его работы. □

Пример 8.1. Вычислим 2153. Здесь /г=8 и 153=[pip2. . .Ps]= = [10011001]. Вызываем ОБРАТНОЕ ([10011001]), которое по очереди рекурсивно вызывает ОБРАТНОЕ с аргументами 1001], [10] и [1]. В строке 1 находим ОБРАТНОЕ( 1])=[10] и возвращаемся к ОБРАТНОЕ ([10]) в строке 2, где полагаем [cocj-«-[10]. Затем в строке 3 вычисляем [di. . .dj -[10]*2- [10]«*[10]=[1000].



Далее в строке 4 полагаем [aoflifl2l=[100]. Цикл в строках 5-7 ничего не меняет. Возвращаемся к вызову ОБРАТНОЕ ([1001]) с [100] в качестве приближения к 2*/[10].

В строке 2 при fe=4 имеем [coCiCa]=[100]. Тогда Idj. . .dgj = =[01110000] и [flo. . .fl4]=[01110]. Снова цикл в строках 5-7 не приводит к изменениям. Возвращаемся к ОБРАТНОЕ ([10011001]) в строке 2, причем [оо. . .С41=[01110]. Далее

[di... d„] = [0110101011011100].

Следовательно, в строке 4 [оо. . . ag]-[0\lO\0\Ol]. В строке 6 находим, что [011010101]#[10011001] (т. е. 213*153 в десятичной записи) равно 32589, тогда как 2i=32768. Поэтому цикл в строках 5-7 добавляет 1 к 213, что дает 214, или [011010110] в двоичной записи. □

Теорема 8.1. Алгоритм 8.1 находит такое число (оо fli . . . а], что

[fl„fl,...a,J.[piP,...p,J = 2«-i-S и 0<S<lp, Pt. . .р„\.

Доказательство. Доказательство проводится индукцией по k. Базис, т. е. случай k=\, тривиален в силу строки 1. Для проведения шага индукции положим C=[ctfii. . .Ck/2], Pi-lpip2-

...pfe/2] ИР«=[р*/2+1 P*/2 + 2. .р*].Т0ГДаР = [р1Ра. .Pj] = Pi2*/2+P,.

По предположению индукции

CPi = 2*-i-S,

где 0<S<Pi. В силу строки 3D=[di da. . .djl определяется равенством

D = C2«*/-C(Pi2*/2-f Pj). (8.3)

Так как pi = l, то Pi>2*/2-) и, значит, С<2*/2. Отсюда следует, что D<2*, и потому для представления D достаточно 2k битов.

Рассмотрим произведение PD=(Pi2*/2+Pg) D, равное в силу (8.3)

PD = CP,2«* +CP,2*/» -(СР,2*/« +CPj) (8.4)

Подставив 2*--S вместо С Pi в (8.4) и сделав некоторые алгебраические упрощения, получаем

PD = 2»*-»-(S2*/»-СР,)». (8.5)

Разделив (8.5) на 2*-» видим, что

2"- = 1 + 7, (8.6)

где r=(S2*/2-СР2)2-<*->. По предположению индукции и в силу неравенства Pi<2*/2 имеем S<2*/2. Так как С<2*/2 и Р,<2*/2, то 0<Т<2*+1.





0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [101] 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174

0.0037