3.2.7
Други
методи за
деление
Other methods for division
Съществуват
множество
реални
примери, в които
операция
деление се
изпълнява
чрез операция
умножение.
Идеята се
състои в замяната
на
непосредственото
деление X/Y с израза X.(1/Y), в
който
делимото Х се
превръща в
множимо, а от
делителят Y сравнително
бързо може да
се получи
реципрочната
стойност 1/Y.
Следва да се
обърне
внимание на
факта, че реципрочната
стойност е
число
по-малко от единица,
т.е.
най-удобна за
неговото
представяне
е формата с
ляво
фиксирана
запетая.
За изчисляване на реципрочната стойност се прилагат различни итерационни сходящи числени методи. Тук ще бъде представен такъв, основаващ се на разложението на функцията
![]()
в сходящ степенен ред. Аргументът e на тази функция представлява безкрайно малко число. Основанията за този избор на функция се налагат при следните разсъждения: ако се приеме например, че числото Ak е известно k-то приближение на реципрочната стойност на делителя Y, то относителната погрешност ek, с която приближението представя истинската стойност, може да бъде оценена така:

И така, ако е известно някакво приближение Ak, то е известна и относителната погрешност ek, а тогава горният израз може да послужи за изразяване на търсената величина:
![]()
Тъй
като ek<1
по условие,
то дробта (отношението)
![]()
може да
се разложи в
безкраен
сходящ степенен
ред:
![]()
В
зависимост
от това каква
скорост на
сходимост на
алгоритъма
желаем да
постигнем,
избираме
броя на
елементите
от реда, с които
ще заместим
разложената
величина. Обикновено
се работи
само с един
или два елемента
от реда, т.е.
![]()
Ако
се замести
отношението
1/(1-ek) в
уравнение (3.2.7.2)
например с
първата от
тези формули,
включваща
само два
елемента от
степенния
ред, то
тогава
равенството
в това определение
се нарушава и
тъй като
отношението
е заместено с
едно първо
приближение,
може да се
приеме, че
така се
определя
само следващото
приближение
към
истинската
стойност на
реципрочността,
т.е.
![]()
За
да може да се
използва
полученото
като рекурентна
формула за
изчисляване
на всяко
следващо
приближение,
е необходима
формула за
изчисляване
на текущата
погрешност ek. Такава
може да се
получи от
уравнение (3.2.7.2):
![]()
След
заместване
се получава
окончателния
вид на
рекурентната
формула за
новото приближение
към
търсената
реципрочна
стойност:
![]()
Когато
за
относителната
погрешност ek
е
избрано
приближението
с три елемента
от степенния
ред,
рекурентната
формула за
изчисляване
на
следващото
приближение,
е следната:
![]()
Прилагането
на първата
формула (3.2.7.4) е
по-изгодно,
тъй като с
умножението Y.Ak
се получава и
разликата (2-Y.Ak), която
може да се разглежда
като
допълнителен
код на умалителя
(-Y.Ak). С
други думи
реализацията
на
рекурентната
формула (3.2.7.5)
изисква две
операции
умножение.
За да
започне
итерационният
процес за изчисление
на
реципрочната
стойност е
необходимо
да се избере
началното приближение
A0,
при това
така, че
относителната
погрешност e да
удовлетворява
условието за
сходимост, т.е.
e<1.
Тъй като
оценката за
приемливата
относителна
погрешност e е
известна
предварително
(тя се
определя от
възможностите
на
разрядната
мрежа), то като
за начало
неравенството
може да се
запише така:
![]()
откъдето
се прави
изводът, че 0 < Y.Ak < 2 , което
се отнася и
за k=0, т.е.
![]()
При
условие, че
делителят Y е ляво
нормализирано
положително
число в една
n-битова разрядна
мрежа, то е
изпълнено
неравенството
(3.2.6.3). Тогава
горното
условие за
избор на
начално
приближение
се определя
окончателно
така:
![]()
И
така, на ляво
нормализиран
делител Y=(0 1yy…yyy) в
n-битова
разрядна
мрежа с дясно
фиксирана запетая:

съответства
начално
приближение
![]()
което ще
бъде
представено
в разрядна
мрежа с ляво
фиксирана
запетая:
![]()
което
според
неравенство
(3.2.7.8) може да
бъде избрано
измежду следните
n-разрядни
стойности:

Заедно
с
изчисляването
на
приближенията A1 , A2 , A3 , ... , Ak трябва
да се
изчисляват и
съответните
им
относителни
погрешности e1 , e2 , e3 , ... , ek, които
гарантирано
намаляват и
клонят към нула.
Навярно на
читателя
вече е ясно,
че условието
за край на
цикличното
итерационно
изчисление
на
реципрочната
стойност се
формулира
чрез
относителната
погрешност с
помощта на
следното
неравенство:
![]()
Като
се има
предвид, че
при
умножение
броят на
цифрите на
произведението
е два пъти
по-голям,
това
означава, че
броят на верните
цифри във
всяко
следващо
приближение,
изчислявано
по формулата
(3.2.7.4), ще се
удвоява. Ако
се избере
начална
стойност A0, в
която има две
верни
значещи
цифри, например
000...0011,
това
означава, че
за
представяне
на реципрочната
стойност в
поле с 32 верни
цифри, ще са необходими
четири
итерации (k=4) или 8
умножения (по
2 на итерация,
виж (3.2.7.4)). Като се
прибави и
последното
умножение X.Ak,
времето за
деление по
този начин
може да се
оцени на 9
умножения. В
процесори, в
които
операция
деление не е
изпълнима
операция,
изложеният
по-горе метод
за деление
позволява
значително
по-бърза
реализация,
отколкото
програмно
моделиране
на
непосредственото
деление под
формата на
специализирана
подпрограма.
Подробен
синтез на
алгоритъм за
деление, на
логическа
структура на
устройство
за деление,
на
микропрограма,
както и
множество числени
примери,
читателят
може да
намери в книга [3].
Следващият
раздел е:
3.2.8
Деление на
числа в
допълнителен
код ( Division
two’s complement numbers )