Страница 1 из 1
нужен .. lsqrt(unsigned long ..)
Добавлено: Сб ноя 16, 2013 16:09:53
edmarch
Привет всем. Среда MicroC от Mikroelektronika не имеет longового извлечения квадратного корня.
на асме то находил,на си надо.
У кого есть поделитесь.
Спасибо заранее.
Re: нужен .. lsqrt(unsigned long ..)
Добавлено: Сб ноя 16, 2013 16:39:41
zöner
Re: нужен .. lsqrt(unsigned long ..)
Добавлено: Сб ноя 16, 2013 16:59:16
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;
}
Re: нужен .. lsqrt(unsigned long ..)
Добавлено: Сб ноя 16, 2013 17:01:13
edmarch
сорри
....
// The second-to-top bit is set: 1L<<30 for long
....
)))))
тока прочитал
Re: нужен .. lsqrt(unsigned long ..)
Добавлено: Сб ноя 16, 2013 17:29:15
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;
}