#c #алгоритм
Добрый день! Есть ли возможность заменить в Си функцию SQRT на что-то более быстрое? Необходимо много миллионов раз вычислять: distance = sqrt((delta_x*delta_x)+(delta_y*delta_y)+(delta_z*delta_z)); Хочется оптимизировать, может кто знает как?
Ответы
Ответ 1
Вот асм код для 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).Ответ 3
Можно попробовать подобрать аппроксимацию, которая будет в заданном диапазоне приближать эту функцию. Например, можно взять большую таблицу (кубическую), отобразить аргументы в индексы, по ним рассчитать таблицу, а уже во время основных расчетов из таблицы извлекать рассчитанные загодя значения. Если интервал значений невелик и требуемая точность не приводит к колоссальным объемам необходимой памяти, будет ускорение.Ответ 4
Если подойдет приблизительная точность, можно воспользоваться «быстрым инверсным квадратным корнем». Там также есть реализация на Си. Так как корень инверсный, то чтобы получить нормальный корень, нужно на него разделить единицу.
Комментариев нет:
Отправить комментарий