Является ли тригонометрия вычислительно дорогой? - PullRequest
20 голосов
/ 19 марта 2010

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

РЕДАКТИРОВАТЬ: Хм, так что, если единственное, что меняется, это градусы (с точностью до 1 градуса), будет ли справочная таблица с 360 записями (для каждого угла) быстрее?

Ответы [ 8 ]

18 голосов
/ 19 марта 2010

Дорогой - относительный термин.

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

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

Все это происходит очень и очень быстро в наши дни, поэтому «дорогой» зависит отсколько вам нужно сделать, и как быстро вам нужно, чтобы это произошло.

Если вы пишете программное обеспечение для 3D-рендеринга в реальном времени, вам, возможно, придется использовать множество умных математических трюков и ярлыков, чтобывыжимайте каждый бит скорости из вашей среды.

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

11 голосов
/ 19 марта 2010

На процессоре Intel x86 сложение или вычитание с плавающей запятой требует 6 тактов, умножение требует 8 тактов и деление 30-44 тактов. Но косинус требует от 180 до 280 тактов.

Это все еще очень быстро, поскольку x86 выполняет все это аппаратно, но гораздо медленнее, чем основные математические функции.

7 голосов
/ 19 марта 2010

Поскольку sin (), cos () и tan () являются математическими функциями, которые вычисляются путем суммирования рядов, разработчики иногда используют таблицы поиска, чтобы избежать дорогостоящих вычислений.

Компромисс в точности и памяти. Чем выше точность, тем больше памяти требуется для справочной таблицы.

Посмотрите на следующую таблицу с точностью до 1 градуса.

http://www.analyzemath.com/trigonometry/trig_1.gif

2 голосов
/ 19 марта 2010

Да, (по отношению к другим математическим операциям умножение, деление): если вы делаете что-то в реальном времени (матричные операции, видеоигры и т. Д.), Вы можете отбросить много циклов, переместив триггер расчеты из вашего внутреннего цикла.

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

2 голосов
/ 19 марта 2010

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

2 голосов
/ 19 марта 2010

Хотя быстрый ответ заключается в том, что они дороже, чем примитивные математические функции (сложение / умножение / вычитание и т. Д.), Они не являются дорогими с точки зрения человеческого времени. Как правило, причина, по которой люди оптимизируют их с помощью справочных таблиц и приближений, заключается в том, что они вызывают их потенциально десятки тысяч раз в секунду, и каждая микросекунда может быть ценной.

Если вы пишете программу и вам просто нужно вызывать ее пару раз в секунду, встроенные функции достаточно быстры.

1 голос
/ 19 марта 2010

Если вы всегда знаете углы, которые вы вычисляете, вы можете хранить их в переменной вместо того, чтобы вычислять их каждый раз.Это также относится к вызову вашего метода / функции, когда ваш угол не изменится.Вы можете быть умным, используя некоторые формулы (вычисление sin (theta) из sin (theta / 2), зная, как часто повторяются значения - sin (theta + 2 * pi * n) = sin (theta)) и сокращая вычисления.См. эту статью в Википедии

0 голосов
/ 19 марта 2010

да, это так. Тригонометрические функции вычисляются суммированием ряда. Таким образом, в общих чертах, это будет намного дороже, чем простая математическая операция. То же самое относится к sqrt

...