[an error occurred while processing this directive]
|
Это же разложение в ряд Тейлора.
1/(1+x)=1-x+x^2-x^3+...
Сколько оставить членов разложения - от точности требуемой зависит. Может уже и линейного члена хватит, т.е. 1/(1+x)~=1-x, может квадратичный понадобится - 1/(1+x)~=1-x+x^2.
Факт тот, что деление заменяется умножением.
Теперь как это приложить.
У Вас есть 32-х р. делимое, D и 32-х разрядный делитель, Z.
Надо найти R=D/Z :-) Сразу - Z=0 случай особый и дальше не рассматривается.
Делитель всегда можно привести к виду: Z=(2^K)*Y.
Y - 32-х разрядное число в диапазоне от 0.5 до 1.
Это обычная нормировка. Соответствующая пара команд есть в любом DSP.
Первая команда определяет порядок K числа Z. Вторая команда сдвигает число Z на K разрядов, получая Y.
Тогда R=(D/Y)*2^(-K)=R0*2^(-K). R0=D/Y. Здесь главное найти R0.
Число Y можно всегда представить так:
Y=M+L*2^(-16).
M -16-ти разрядное число, старшие 16 разрядов Y; L - тоже 16-ти разрядное число, но младшие 16 разрядов Y.
Нормировка, про которую писал выше, гарантирует, что M не равно 0.
Y=M+L*2^(-16)=M*[1+(L/M)*2^(-16)]=M*(1+x). x=(L/M)*2^(-16).
L и М 16-ти разрядные, т.е. x вычисляется с использованием деления 32 на 16.
Тогда R0=D/Y=D/[M*(1+x)]=R1/(1+x). R1=D/M. Т.к. M - 16-ти разрядное, то R1 тоже через деление 32 на 16.
А дальше, вместо того, чтобы делить R1 на 1+x, нужно умножить R1 на разложение в ряд функции 1/(1+x), ограничив число членов разложения необходимой точностью.
В итоге имеем деление 32 на 32 выполненное через деления 32 на 16.