Замена функции sqrt с целью ускорения

Рейтинг: 3Ответов: 3Опубликовано: 12.03.2011

Добрый день!

Есть ли возможность заменить в Си функцию SQRT на что-то более быстрое? Необходимо много миллионов раз вычислять:

distance = sqrt((delta_x*delta_x)+(delta_y*delta_y)+(delta_z*delta_z));

Хочется оптимизировать, может кто знает как?

Ответы

▲ 4

Вот асм код для sqrt

FLD     X
FSQRT
FWAIT

Быстрее ничего нету. Хотя, насколько я знаю, в Си реализовано также.

Лучше попробуйте оптимизировать цикл.

▲ 2

Очень просто. Работайте с квадратами расстояний:

distanceSqr = ((delta_x * delta_x)+(delta_y * delta_y)+(delta_z * delta_z));

Судя по всему, вас интересуют длины векторов. Так обычно с ними и работают.

Добавление.

Вообще, в Си можно асм-вставки делать, наверное, ничего быстрее асмовых функций уже не придумаете. Для возведения в произвольную вещественную степень можно использовать логарифмы:

a^b = exp(b* ln(a))

Асм уже плохо помню, но помнится, что fpu считает такое довольно быстро (по сути это два разложения в ряды Тейлора, что в общем случае быстрее метода последовательных приближений, который скорей всего юзается в sqrt).

▲ 1

Можно попробовать подобрать аппроксимацию, которая будет в заданном диапазоне приближать эту функцию. Например, можно взять большую таблицу (кубическую), отобразить аргументы в индексы, по ним рассчитать таблицу, а уже во время основных расчетов из таблицы извлекать рассчитанные загодя значения. Если интервал значений невелик и требуемая точность не приводит к колоссальным объемам необходимой памяти, будет ускорение.