[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Поскольку 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: info@telesys.ru