Функция быстрого квадратного корня для целых чисел.

victor_pv
Сб 2 мая 2015 г. 14:37
Просто хотел поделиться этим алгоритмом расчета квадратного корня, который я нашел несколько недель назад:
http: // medialab.FreakNet.org/martin/src/sqrt/sqrt.в

Я сравнил его с нормальной функцией SQRT (), включенной в IDE, и с еще одной рутиной, которую я нашел в Интернете, и она была примерно в 10 раз быстрее, чем в среднем.
Он работает отлично для 32 -битных целых чисел, возвращая другое целое число. Не полезно, если вам нужна плавающая точка, но если вам не нужно больше точности, чем целые числа (например, расчет координат на дисплее, нет необходимости в десятичных десятках), и вы рассчитываете много квадратных корней, это может обеспечить некоторое улучшение скорости к вашему коду.

Чтобы сравнить скорость каждой процедуры, я рассчитал весь квадратный корень из 1.000.000 до 1. Я мог бы пойти выше, до 4.000.000.000, но для всего этого потребуется много времени.
Когда у меня снова будет работающий Mini, я протестирую с несколькими диапазонами, чтобы увидеть, улучшения скорости по сравнению со стандартной функцией SQRT в основном на определенных длинах битов, так как скорость зависит от размера числа.

Это код, но на этой веб -странице тоже: uint16_t asqrt(uint32_t x) { /* From http://medialab.freaknet.org/martin/src/sqrt/sqrt.c * Logically, these are unsigned. We need the sign bit to test * whether (op - res - one) underflowed. */ int32_t op, res, one; op = x; res = 0; /* "one" starts at the highest power of four <= than the argument. */ one = 1 << 30; /* second-to-top bit set */ while (one > op) one >>= 2; while (one != 0) { if (op >= res + one) { op = op - (res + one); res = res + 2 * one; } res /= 2; one /= 4; } return (uint16_t) (res); }

Эдуардо
Сб 14 ноября 2015 г. 14:02
Привет.
Ваш алгоритм и другие хорошо объяснены здесь:
http: // www.Codecodex.com/Wiki/Рассчитайте ... quare_root

Пожалуйста, учтите, что алгоритм был задумано, избегая умножения. Сегодня даже у AVR есть HW Mult. Итак, есть и другие алгоритмы, которые могут выиграть. Если ваш кодовый кадр готов к тестированию, вы можете проверить это:
unsigned int sqrt32(unsigned long n) { unsigned int c = 0x8000; unsigned int g = 0x8000; for(;;) { if(g*g > n) { g ^= c; } c >>= 1; if(c == 0) { return g; } g |= c; } }

JCW
Сб 14 ноября 2015 г., 17:07
Ох, умный!

Rogerclark
Сб 14 ноября 2015 г., 19:45
unsigned int sqrt32(unsigned long n) { unsigned int c = 0x8000; unsigned int g = 0x8000; for(;;) { if(g*g > n) { g ^= c; } c >>= 1; if(c == 0) { return g; } g |= c; } }

Rjw
Пн, 08 февраля 2016 г., 19:31
Спасибо за полезный алгоритм. Код работал лучше для меня с G -типированием как без подписного длинного

Эдуардо
Вт 23 февраля 2016 г. 13:13
@Rjw.
Рад, что это помогло. Я взял это по ссылке выше, и я не проверял его с реальным кодом, чтобы быть правдой.
Ваше замечание об int или long интересно. Мне придется проверить это. Что значит "...работал лучше.." точно?
@Roger: в следующий раз я буду использовать правильное форматирование : D

Mrburnette
Вт 23 февраля 2016 г. 14:14
За эти годы я видел публикацию многочисленных фрагментов кода для «быстрых» расчетов математических функций. Эти алгоритмы часто имеют границы, где они работают, и за пределами границ, их точность не удается. Многие были разработаны и опубликованы, когда компьютеры были гораздо менее мощными, чем сегодня. Многие были разработаны, например, Кордич, для военных, а затем быстро нашли свой путь в потребительские использования (Принципы кордика используются в научных калькуляторах HP.)

Именно здесь я предостерегаю пользователей таких алгоритмов для создания тестовых случаев для своих данных и тщательно и тщательно проверять, чтобы убедиться, что набор данных точно разрешается в рамках оперативных границ их проекта. Я не могу подчеркнуть, что плохие результаты быстро получены, когда алгоритм сбивается с пути.

Луча

Zoomx
Ср 24 февраля 2016 г. 15:59
Как насчет численных рецептов? Первоначально написано в Fortran, теперь есть также версия C. И паскаль тоже.

Mrburnette
Ср 24 февраля 2016 г. 16:48
Zoomx написал:Как насчет численных рецептов? Первоначально написано в Fortran, теперь есть также версия C. И паскаль тоже.

Рик Кимбалл
Ср 24 февраля 2016 г., 20:13
https: // en.Википедия.org/wiki/libfixmath

Там куча процедур, которые реализуют для вас фиксированную точку. Я собрал это на MSP430, которая имеет очень медленные процедуры плавающей запятой и получил довольно хорошие результаты.

-рик

Zoomx
Чт 25 февраля 2016 г., 16:37
Я читал численные рецепты, когда это была только книга, а Интернет был на ранней стадии. В то время это было только в Фортране. Я не помню лицензию в то время.
Мне совсем не нравится (новый?) лицензия. Итак, Рэй, ты прав!

Недостаток STM32F103 до 48 МГц