Во аж 4-е алгоритма, на любой вкус, но целочисленные.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено AlexandrY 01 сентября 2003 г. 19:05
В ответ на: Подпрограмма вычисления квадратного корня для AVR отправлено GJ 01 сентября 2003 г. 18:52


Example 1: (a) Newton's Method; (b) summing terms.

(a)
// Newton's Method -- O( log2 N )
unsigned long sqroot( unsigned long N )
{
unsigned long n, p, low, high;
if( 2 > N )
return( N );
low = 0;
high = N;
while( high > low + 1 )
{
n = (high + low) / 2;
p = n * n;
if( N < p )
high = n;
else if( N > p )
low = n;
else
break;
}
return( N == p ? n : low );
}

(b)
// Summing terms -- O( sqrt N )
unsigned long sqroot( unsigned long N )
{
unsigned long n, u, v;
if( 2 > N )
return( N );
u = 4;
v = 5;
for( n = 1; u <= N; n++ )
{
u += v;
v += 2;
}
return( n );
}
Example 2: (a) Binomial theorem; (b) optimized binomial theorem.

(a)
// Binomial Theorem -- O( 1/2 log2 N )
unsigned long sqroot( unsigned long N )
{
unsigned long l2, u, v, u2, v2, uv2, n;
if( 2 > N )
return( N );
u = N;
l2 = 0;
while( u >>= 1 )
l2++;
l2 >>= 1;
u = 1L << l2;
u2 = u << l2;
while( l2-- )
{
v = 1L << l2;
v2 = v << l2;
uv2 = u << (l2 + 1);
n = u2 + uv2 + v2;
if( n <= N )
{
u += v;
u2 = n;
}
}
return( u );
}

(b)
// Optimized Binomial Theorem
unsigned long sqroot( unsigned long N )
{
unsigned long l2, u, v, u2, n;
if( 2 > N )
return( N );
u = N;
l2 = 0;
while( u >>= 2 )
l2++;
u = 1L << l2;
v = u;
u2 = u << l2;
while( l2-- )
{
v >>= 1;
n = (u + u + v) << l2;
n += u2;
if( n <= N )
{
u += v;
u2 = n;
}
}
return( u );
}



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

Ответы



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

E-mail: info@telesys.ru