нужен .. lsqrt(unsigned long ..)

Обсуждаем контроллеры компании Atmel.
Ответить
edmarch
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт сен 10, 2010 09:41:35

нужен .. lsqrt(unsigned long ..)

Сообщение edmarch »

Привет всем. Среда MicroC от Mikroelektronika не имеет longового извлечения квадратного корня.
на асме то находил,на си надо.
У кого есть поделитесь.
Спасибо заранее.
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: нужен .. lsqrt(unsigned long ..)

Сообщение zöner »

побитный сдвиг не пойдет ? http://stackoverflow.com/questions/1555 ... -bit-shift
edmarch
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт сен 10, 2010 09:41:35

Re: нужен .. lsqrt(unsigned long ..)

Сообщение edmarch »

спасибо за ответ.по вашей ссылке вроде из short, то есть из 16bit корень.
вот нашёл,на микрочипе).может и остальным пригодится
Автор: IgorV ()

//Вычисление целочисленного корня квадратного из long int
unsigned int lsqrt(unsigned long arg){
char count=16;
unsigned long res=0,tmp=0;
if(arg!=0){
if(!(arg&0xFF000000)){arg<<=8;count-=4;}


res=1;
while((tmp<1)&&(count)){
count--;
if(arg&0x80000000UL)tmp|=2;
if(arg&0x40000000UL)tmp|=1;

arg<<=2;


};//поиск первой 1-ы
tmp--;
for(count;count;count--){
tmp<<=2;
res<<=1;

if(arg&0x80000000UL)tmp|=2;
if(arg&0x40000000UL)tmp|=1;
arg<<=2;

if( tmp>=((res<<1)|1)){
tmp-=((res<<1)|1);
res|=1;
}

}
}
return (unsigned int)res;
}
edmarch
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт сен 10, 2010 09:41:35

Re: нужен .. lsqrt(unsigned long ..)

Сообщение edmarch »

сорри
....
// The second-to-top bit is set: 1L<<30 for long
....
)))))
тока прочитал
edmarch
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт сен 10, 2010 09:41:35

Re: нужен .. lsqrt(unsigned long ..)

Сообщение edmarch »

работает проверено. zöner спасибо

unsigned long lsqrt(unsigned long num) {
unsigned long res = 0;
unsigned long lbit = 1 << 30; // The second-to-top bit is set: 1L<<30 for long

// "bit" starts at the highest power of four <= the argument.
while (lbit > num)
{ lbit >>= 2; }

while (lbit != 0)
{
if (num >= res + lbit)
{
num -= res + lbit;
res = (res >> 1) + lbit;
}
else
{ res >>= 1; }
lbit >>= 2;
}
return res;
}
Ответить

Вернуться в «AVR»