Что более эффективно, atan2 или sqrt?

Бывают ситуации, когда существует несколько методов для вычисления одного и того же значения.

Прямо сейчас я придумываю алгоритм "расширения" двумерного выпуклого многоугольника. Для этого я хочу найти направление возмущения каждой вершины. Чтобы получить результат, который расширяет многоугольник «оболочкой» одинаковой толщины по всему периметру, величина возмущения в этом направлении также зависит от угла при вершине. Но сейчас меня просто беспокоит направление.

Один из способов - использовать atan2: пусть B - моя вершина, A - предыдущая вершина, а C - следующая вершина. Мое направление - это «среднее угловое значение» угла (B-A) и угла (B-C) .

Другой способ - sqrt: единица (BA) + единица (BC) , где единица (X) равно X / длина (X) дает вектор с моей стороны.

Я склоняюсь к методу № 2, потому что усреднение значений углов требует некоторой работы. Но я в основном выбираю между двумя вызовами atan2 и двумя вызовами sqrt. Что вообще быстрее? Что, если бы я делал это в шейдерной программе?

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

Насколько мне известно, и функциям sqrt, и триггерам требуется итерационный метод для получения ответа. Это причина, по которой мы стараемся избегать их, когда это возможно. Люди придумали «приблизительные» функции, которые используют таблицы поиска, интерполяцию и тому подобное, чтобы попытаться получить более быстрые результаты. Я, конечно, никогда не буду беспокоиться об этом, если я не найду убедительных доказательств наличия узких мест в моем коде только из-за этих подпрограмм или подпрограмм, которые сильно их задействуют, но различия между функциями sqrt, триггерами и обратными триггерами могут иметь значение для обсуждения. .

5
задан Steven Lu 16 February 2012 в 18:45
поделиться