реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Квадратный корень, Нужен пример на С или алгоритм
Pat
сообщение Oct 22 2005, 21:53
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Надо извлечь квадратный корень из unsigned long получив тоже unsigned long.
Может есть у кого готовая быстрая (точная) функция, или ответьте.
Какой алгоритм самый быстрый?
Какой самый точный?
И есть ли точный и быстрый? smile.gif
Из сишных библиотек просьба не предлогать, медленно работают smile.gif
Go to the top of the page
 
+Quote Post
YAM
сообщение Oct 23 2005, 07:17
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 7-07-04
Из: Ukraine
Пользователь №: 291



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

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


--------------------
Go to the top of the page
 
+Quote Post
Pat
сообщение Oct 23 2005, 08:27
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(YAM @ Oct 23 2005, 10: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;
}
*

Большое спасибо только скажите что это за преременная ul
if( ul & temp ) break;
temp>>=2;
Go to the top of the page
 
+Quote Post
fontp
сообщение Oct 23 2005, 12:03
Сообщение #4


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



http://forum.electronix.ru/index.php?showtopic=1978&hl=sqrt
Go to the top of the page
 
+Quote Post
Pat
сообщение Oct 23 2005, 13:38
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(fontp @ Oct 23 2005, 15:03)

Спасибо, чего то поиском у меня не нашло в форуме
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016