Надо извлечь квадратный корень из unsigned long получив тоже unsigned long. Может есть у кого готовая быстрая (точная) функция, или ответьте. Какой алгоритм самый быстрый? Какой самый точный? И есть ли точный и быстрый? Из сишных библиотек просьба не предлогать, медленно работают
YAM
Oct 23 2005, 07:17
Вариант1
unsigned short sqrt32( unsigned long in) { unsigned long mask, sqr = 0, temp; char j=16;
temp = 0xC0000000; do { if( ul & temp ) break; temp>>=2; } while( --j); if( j==0 ) return 0; // а можно еще if( j<=8 ) return sqrt16( in); mask = temp & (temp>>1); do { temp = sqr | mask; sqr >>= 1; if( temp <= in ) { sqr |= mask; in -= temp; } mask >>= 2; } while( --j ); return sqr; }
Вариант2
ushort iSqrt(unsigned int Val) { unsigned int bitSqr = 0x40000000; unsigned int root = 0;