Анимация
JavaScript


Главная  Библионтека 

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

q = q + 1;

r = r - abs(d);

Из левой половины неравенства (4) и правой половины (16) вместе с доказанным границами для т следует, что =1 г""/!*?!] < 2* , так что q можно представить W-6HT0Bbii

беззнаковым числом. Кроме того, О S г < , так что г можно представить W-6htobi>ii

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

Далее вычисляется J = - г. Оба члена разности представимы в виде -битовш

беззнаковых целых чисел (так же, как и разность 1S J < ), так что данное вычислени

не представляет никаких трудностей.

Для того чтобы избежать длинного умножения в (19), перепищем его в виде

Величина 2/\п,\ представима в виде W-битового беззнакового целого числа (анало

гично (7), из (19) может быть показано, что 2*" S2nd и если rf=-2", то и, =-2*+1

и р = 2М-2, так что 2/п, = 2*У(2*~-1)<2* при йЗ). Эти вычисления так же, как

и в случае rem(2,jt/), могуг быть инкремеитными (при увеличении р). Сравнение для

случая 2/п2 2*" (что может произойти при больших <f) должно быть беззнаковым.

Для вычисления т не требуется непосредственное вычисление (20), при котором может понадобиться длинное деление. Заметим, что

2[t/[-rem(2[t/[) 2

м т

Проверка завершения цикла 2/\п,\ > 5 вычисляется достаточно сложно. Величина 2f\n\

доступна только в виде частного qx и остатка г\. Величина 2j\n\ может бьпъ (а может и не

быть) целой (эта величина является целой только для d - 2* +1 и некоторых отрицательных значений йО-Проверка 2f\n\<.S может быть закодирована следующим образом:

<,,<81(<,,=8&г,=0).

Полностью процедура для вычисления м и s для данного d показана в листинге 10.1, где представлена программа на языке С для IV = 32 . Здесь есть несколько мест, где может произойти переполнение, однако если его игнорировать, то полученный результат оказывается корректным.

Листинг 10.1. Вычисление магического числа для знакового деления

struct ms {

int М; Магическое число int S; Величина сдвига

+ \ = q + \.



struct ms magic(int d)

( d должно удовлетворять условию

2 <= d <= 2**31-1 или -2**31 <= d <= -2

int p;

unsigned ad, anc, delta, ql, rl, q2, r2, t; const unsigned two31 = 0x80000000; 2**31 struct ms mag; ad = abs(d);

t = twc31 + ((unsigned)d >> 31);

anc = t - 1 - t%ad; Абсолютное значение пс

p = 31; Инициализация p

ql = two31/anc; Инициализация ql = 2**p/nc

rl = two31 - ql*anc; Инициализация rl = rem(2**p,nc)

q2 = two31/ad; Инициализация q2 = 2**p/d

r2 = two31 - q2*ad; Инициализация г2 = rem(2**p,d)

do {

p = p + 1;

ql = 2*ql; Обновление ql = 2**p/nc.

rl = 2*rl; Обновление rl = rem(2**p,nc)

if (rl >= anc) Здесь требуется беззнаковое { сравнение

ql = ql + 1;

rl = rl - anc;

q2 = 2*q2; Обновление q2 = 2**p/d

r2 = 2*r2; Обновление г2 = rem(2**p,d)

if (r2 >= ad) Здесь требуется беззнаковое { сравнение

q2 = q2 + 1;

Г2 = Г2 - ad;

delta •= ad - г2; } while (ql < delta (ql -= delta && rl == 0)); mag.M = q2 + 1; if (d < 0)

mag.M = -mag.M; Магическое число и mag.s = p - 32; величина сдвига

return mag;

Для использования результата этой программы компилятор должен сгенерировать команды Ни mulhs, команду add при d > о и м < о или sub при d<OHM>OH, наконец, команду shrsi при s > 0. После этого генерируются команды shri и add.

В случае W = 32 можно избежать обработки отрицательного делителя, если использовать предвычисленный результат для d=3 и =715827883, а для остальных отрицательных делителей использовать формулу m{-d) = -m(d). Однако при этом программа

из листинга 10.1 не станет значительно короче (если вообще сократится).

10.7. Дополнительные вопросы

Теорема DC2. Наименьший множитель т нечетен, если р не равно W в принудительном порядке.



Доказательство. Предположим, что уравнения (1,а) и (1,6) выполняются при наименьшем (не установленном принудительно) значении р и четном т. Очевидйо, что тогда т можно разделить на 2, а р уменьшить на 1 и уравнения останутся справедливы. Но это противоречит предположению о том, что р- наименьшее значение, при котором выполняются данные уравнения.

Единственность

Магическое число для данного делителя может быть единственным (как, например, в случае W=32, d=l), но зачастую это не так. Более того, эксперименты указывают, что как раз обычно имеется несколько магических чисел для одного делителя. Например, для W=32, d=e имеется четыре магических числа:

Л/= 715827833 ((2" + 2)/б) s = 0

М= 1431655766 ((2"+2)/з) s=l

М= -1431655765 ((2" + 1)/3-2=) s = 2

М= -1431655764 ((2" + 4)/3-2) s = 2. Однако есть следующая теорема.

Теорема DC3. Для данного делителя d существует только один множитель т, имеющий минимальное значение р, если р не приравнивается к We принудительном порядке.

Доказательство. Рассмотрим сначала случай d>0. Разность между верхней и нижней границами в неравенстве (4) составляет 2/dn,. Мы уже доказали (7), т.е. что если р минимально, то 2/dn, < 2. Таким образом, может быть не более двух значений т, которые удовлетворяют неравенству (4). Пусть т равно минимальному из этих значений, задаваемому соотношением (5); тогда второе допустимое значение - га +1.

Пусть Ро - наименьшее значение р, для которого т +1 удовлетворяет правой части неравенства (4) (значениеро не приравнено к Wb принудительном порядке). Тогда

2"+rf-rem(2.rf) 2 я,+1 d d п,

Это выражение упрощается до >

г" >n2d-rem(2*,d)).

Деление на 2 дает

/ J N

2->и, d-rem(2°.d) . V 2 J

Поскольку в соответствии с теоремой D5 из раздела 9.1 rem(2,rf)< 2rem(2",d), получаем

2"->n,(rf-rem(2°",d)),

что противоречит предположению о минимальности ро-

Доказательство для случая d<0 аналогично и здесь не приводится.



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