Перейти к содержанию
    

Квадратный корень

Надо извлечь квадратный корень из unsigned long получив тоже unsigned long.

Может есть у кого готовая быстрая (точная) функция, или ответьте.

Какой алгоритм самый быстрый?

Какой самый точный?

И есть ли точный и быстрый? :)

Из сишных библиотек просьба не предлогать, медленно работают :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариант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);

}

 

типы данных преобразуете сами.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариант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;

}

Большое спасибо только скажите что это за преременная ul

if( ul & temp ) break;

temp>>=2;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, чего то поиском у меня не нашло в форуме

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...