Цитата(DS @ May 10 2008, 12:25)

Странно, у меня вычисление на ADSP-21 занимает 23 такта при аппроксимации 5 порядком вместе с нормализацией/денормализацией.
самое быстрое что пробовал.
unsigned int isqrt(unsigned int x) --- этот тест не прошёл гдето опечатка
{
unsigned int s,g0,g1;
if(x<=4224)
if(x<=24)
if(x<=3) return (x+3)>>2;
else if(x<=8) return 2;
else return (x>>4)+3;
else if(x<=288)
if(x<=80) s=3; else s=4;
else if (x<=1088) x=5; else s=6;
else if(x<=1024*1025-1)
if(x<=257*257-1)
if(x<=129*129-1) s=7; else s=8;
else if(x<=513*513-1) s=9;else s=10;
else if (x<= 4097*4097 -1)
if (x<=2049*2049 -1) s=11;else s=12;
else if(x<=16385*16385-1)
if(x<=8193*8193-1) s=13; else s= 14;
else if(x<=32769*32769-1)s=15;else s=16;
g0=1<<s;
g1 = (g0+(x>>s))>>1;
while(g1<g0) {
g0=g1;
g1=(g0+(x/g0))>>1;
};
return g0;
}
Цитата(1S49 @ May 9 2008, 18:27)

Пожалуйста. Но главным образом благодарите Соединенные Штаты Америки, породившие фирму TI , которая собрала неплохих программистов Америки, Индии, Китая и России и написавших эту библиотеку.
Код
Да вот это на арме летает просто!!!
проверено в сравнении с sqrt на округление до 1650503060 все ок.
unsigned int isqrt2(unsigned long src) - здесь время константное. самый быстрый что я пробовал метод
{
unsigned long wrk;
unsigned int dst;
int i;
dst = 0x8000;
wrk = 0x8000;
for(i=0; i<16; i++)
{
if((long)dst*dst>src) dst &= ~wrk;
wrk >>= 1;
dst |= wrk;
}
return dst;
}
Сообщение отредактировал nicks80 - Jun 14 2008, 21:28