Вычислительная стоимость триггерных функций
Возможный дубликат:
Как работают тригонометрические функции?
Что фактически входит в вычисление триггерных функций, таких как Sin, Cos, Tan и Atan?
Думаю, я нашел оптимизацию в своем коде, где я могу избежать использования любой из этих функций и основывать проблему на склоне вместо углов. Таким образом, это означает, что вместо вышеупомянутых триггерных функций выполняются операции с парами деления. Но я хотел бы узнать больше о том, что входит в эти триггерные функции, чтобы я мог сравнить свой новый код (с точки зрения количества основных математических операций). Или, может быть, я только что нашел более крутой способ сделать то же самое или, что еще хуже, ввести менее эффективный метод.
Использование С++ и Python, но я полагаю, что это довольно язык, агностик с затратами на математическую операцию относительно самых примитивных операций.
Ответы
Ответ 1
Современные процессоры x86 включают триггерные функции в их наборе команд, но они выполняют много циклов для выполнения. Поэтому, если вы находитесь на таком процессоре, и если у вас нет зависимостей в коде (т.е. Вам не нужен результат вычисления одного греха, чтобы начать следующий), то вы, вероятно, не получите гораздо быстрее чем использование sin и cos непосредственно, так как они будут полностью конвейерными, достигая эффективной скорости 1 за цикл.
Ответ 2
Вам необходимо прокомментировать ваш код!
Вам нужно прокомментировать это самостоятельно. Основываясь на моих результатах, триггерные функции занимают около 100 нс и делений около 20 нс. Это может быть легко преобразовано в ответы. Но опять же, самое главное, вы профилируете это на своем оборудовании. Таким образом, вы получите правильные ответы и знания для своей системы.
Ответ 3
(Это был изначально комментарий на кодкайзен, но он получил довольно длинный....)
(Codekaizen): Большинство триггерных функций реализованы в качестве таблиц поиска в эти дни.
um.. Так как большинство триггерных функций принимают аргумент двойной точности, поиск значения не является практическим. Я считаю, что большинство из них ищут целые числа с каждой стороны, а затем интерполируют оттуда (т.е. Sin (5.279) составляет 27.9% от Sin (5) до Sin (6)). Это меньше работы, которая вычисляет значение напрямую, но все равно справедливое количество вычислений.
Ответ 4
Большинство функций-триггеров реализованы в качестве справочных таблиц в эти дни.
Ответ 5
Мой опыт от тригонометрических функций заключается в том, что они чрезвычайно быстрые и большинство из них реализованы как таблицы поиска в любом случае... То есть, несколько делений и деления на нуль проверок, вероятно, будут медленнее, чем вызов тригонометрической функции.
Ответ 6
Единственный реальный ответ, который вы получите, это "Профиль".
Скорее всего, если это не является узким местом в вашем коде, это не будет иметь заметных различий.
Ответ 7
Посмотрите glibc. Он использует несколько различных реализаций, некоторые из них (например, sysdeps/ieee754/s_sin.c) выглядят действительно сложными, в то время как другие используют инструкцию сборки (например, sysdeps/x86_64/fpu/s_sincos.S). Трудно сказать фактическое время, требуемое без каких-либо измерений.
Ответ 8
Ближайший оптимальный метод (и обычно используемый метод) для вычисления тригонометрических функций - через ортогональное многочленное расширение (ряд Чебышева). Такой ряд с соответствующим числом членов будет быстрее, чем поиск в таблице.
http://en.wikipedia.org/wiki/Chebyshev_polynomials