[an error occurred while processing this directive] [an error occurred while processing this directive]
Про деление присоединяюсь к предыдущему ответу (DIVQ, DIVS) , а sqrt реализуется намного проще.
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено kons 19 февраля 2002 г. 12:27
В ответ на: Нужна помощь отправлено Евгений Данилов 18 февраля 2002 г. 17:50

Поскольку sqrt - монотонно возрастающая функция, наиболее оптимален алгоритм поразрядного приближения. Применял везде - от 89C51 до ADSP. Чтобы было понятно, алгоритм привожу на C (хотя для скорости реализуется, как правило, на соотв. asm).
Работа алгоритма аналогична работе АЦП поразрядного приближения - в каждом цикле в регистре последователного приближения (result) устанавливается текущий разряд (tst_mask, начиная со старшего), затем делается пробное возведение в квадрат (аналог ЦАП), квадрат сравнивается с подкоренной величиной val (компаратор!) и если он превышает val, то текущий разряд сбрасывается обратно в 0.

short sqrt(long val)
{
short result;
short tst_mask;
short k;

tst_mask=0x4000;
result=0;
for(k=0; k<15;k=k+1)
{
result = result | tst_mask;
if((long)result*(long)result > val) result = result & ~tst_mask;
tst_mask = tst_mask>>1;
}
return result;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru