Pat 0 22 октября, 2005 Опубликовано 22 октября, 2005 · Жалоба Надо извлечь квадратный корень из unsigned long получив тоже unsigned long. Может есть у кого готовая быстрая (точная) функция, или ответьте. Какой алгоритм самый быстрый? Какой самый точный? И есть ли точный и быстрый? :) Из сишных библиотек просьба не предлогать, медленно работают :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
YAM 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба Вариант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; while (bitSqr != 0) { if (Val >= (bitSqr + root)) { Val = Val - (bitSqr + root); root = (root >> 1) | bitSqr; } else root = (root >> 1); bitSqr = (bitSqr >> 2); } return(root); } типы данных преобразуете сами..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pat 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба Вариант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; } <{POST_SNAPBACK}> Большое спасибо только скажите что это за преременная ul if( ul & temp ) break; temp>>=2; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fontp 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба http://forum.electronix.ru/index.php?showtopic=1978&hl=sqrt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pat 0 23 октября, 2005 Опубликовано 23 октября, 2005 · Жалоба http://forum.electronix.ru/index.php?showtopic=1978&hl=sqrt <{POST_SNAPBACK}> Спасибо, чего то поиском у меня не нашло в форуме Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться