В математике таблицы тригонометрических функций полезны в ряде областей. До появления карманных калькуляторов тригонометрические таблицы были необходимы для навигации , науки и техники . Вычисление математических таблиц было важной областью изучения, что привело к разработке первых механических вычислительных устройств .
Современные компьютеры и карманные калькуляторы теперь генерируют значения тригонометрических функций по требованию, используя специальные библиотеки математического кода. Часто эти библиотеки используют предварительно рассчитанные таблицы внутри и вычисляют требуемое значение, используя подходящий метод интерполяции . Интерполяция простых таблиц поиска тригонометрических функций все еще используется в компьютерной графике , где может потребоваться лишь скромная точность, а скорость часто имеет первостепенное значение.
Другое важное применение тригонометрических таблиц и схем генерации — алгоритмы быстрого преобразования Фурье (БПФ), где одни и те же значения тригонометрической функции (называемые вращающимися коэффициентами ) должны оцениваться много раз в данном преобразовании, особенно в общем случае, когда вычисляется много преобразований одинакового размера. В этом случае вызов общих библиотечных процедур каждый раз неприемлемо медленен. Один из вариантов — вызвать библиотечные процедуры один раз, чтобы построить таблицу тех тригонометрических значений, которые понадобятся, но это требует значительного объема памяти для хранения таблицы. Другая возможность, поскольку требуется регулярная последовательность значений, — использовать рекуррентную формулу для вычисления тригонометрических значений на лету. Значительные исследования были посвящены поиску точных, стабильных рекуррентных схем, чтобы сохранить точность БПФ (которая очень чувствительна к тригонометрическим ошибкам).
Тригонометрическая таблица по сути является справочной диаграммой, которая представляет значения синуса, косинуса, тангенса и других тригонометрических функций для различных углов. Эти углы обычно располагаются в верхней строке таблицы, в то время как различные тригонометрические функции помечены в первом столбце слева. Чтобы найти значение определенной тригонометрической функции под определенным углом, вам нужно найти строку для функции и проследовать по ней до столбца под нужным углом. [1]
Современные компьютеры и калькуляторы используют различные методы для предоставления значений тригонометрических функций по запросу для произвольных углов (Kantabutra, 1996). Одним из распространенных методов, особенно на высокопроизводительных процессорах с устройствами с плавающей точкой , является объединение полиномиальной или рациональной аппроксимации (например, приближения Чебышева , наилучшего равномерного приближения, приближения Паде и, как правило, для более высокой или переменной точности, рядов Тейлора и Лорана ) с сокращением диапазона и табличным поиском — сначала они ищут ближайший угол в небольшой таблице, а затем используют полином для вычисления поправки. Поддержание точности при выполнении такой интерполяции нетривиально, но для этой цели можно использовать такие методы, как точные таблицы Гала , сокращение диапазона Коди и Уэйта и алгоритмы сокращения радиан Пейна и Ханека. На более простых устройствах, в которых отсутствует аппаратный множитель , существует алгоритм под названием CORDIC (а также связанные с ним методы), который более эффективен, поскольку он использует только сдвиги и сложения. Все эти методы обычно реализуются на аппаратном уровне из соображений производительности.
Конкретный полином, используемый для аппроксимации тригонометрической функции, генерируется заранее с использованием некоторого приближения алгоритма минимаксной аппроксимации .
Для вычислений с очень высокой точностью , когда сходимость разложения в ряд становится слишком медленной, тригонометрические функции можно аппроксимировать средним арифметико-геометрическим , которое само аппроксимирует тригонометрическую функцию ( комплексным ) эллиптическим интегралом (Брент, 1976).
Тригонометрические функции углов, которые являются рациональными кратными 2π, являются алгебраическими числами . Значения для a/b·2π можно найти, применив тождество Муавра для n = a к корню b-й степени из единицы , который также является корнем многочлена x b - 1 в комплексной плоскости . Например, косинус и синус 2π ⋅ 5/37 являются действительной и мнимой частями , соответственно, 5-й степени 37-го корня из единицы cos(2π/37) + sin(2π/37)i, который является корнем многочлена степени -37 x 37 − 1. Для этого случая алгоритм нахождения корня, такой как метод Ньютона, намного проще, чем алгоритмы арифметико-геометрического среднего, описанные выше, при этом сходясь с аналогичной асимптотической скоростью. Однако последние алгоритмы необходимы для трансцендентных тригонометрических констант.
Исторически самым ранним методом, с помощью которого вычислялись тригонометрические таблицы, и, вероятно, наиболее распространенным до появления компьютеров, было многократное применение тригонометрических тождеств половинного угла и сложения углов , начиная с известного значения (например, sin(π/2) = 1, cos(π/2) = 0). Этот метод использовался древним астрономом Птолемеем , который вывел их в Альмагесте , трактате по астрономии . В современной форме выведенные им тождества формулируются следующим образом (со знаками, определяемыми квадрантом, в котором лежит x ):
Они были использованы для построения таблицы хорд Птолемея , которая применялась к астрономическим задачам.
Возможны и другие перестановки этих тождеств: например, в некоторых ранних тригонометрических таблицах использовались не синус и косинус, а синус и версинус .
Быстрый, но неточный алгоритм вычисления таблицы из N приближений s n для sin (2 π n / N ) и c n для cos (2π n / N ) выглядит следующим образом:
для n = 0,..., N − 1, где d = 2π/ N .
Это просто метод Эйлера для интегрирования дифференциального уравнения :
с начальными условиями s (0) = 0 и c (0) = 1, аналитическое решение которых равно s = sin( t ) и c = cos( t ).
К сожалению, это бесполезный алгоритм для генерации таблиц синусов, поскольку он имеет значительную погрешность, пропорциональную 1 / N.
Например, для N = 256 максимальная ошибка в значениях синуса составляет ~0,061 ( s 202 = −1,0368 вместо −0,9757). Для N = 1024 максимальная ошибка в значениях синуса составляет ~0,015 ( s 803 = −0,99321 вместо −0,97832), что примерно в 4 раза меньше. Если бы полученные значения синуса и косинуса были нанесены на график, этот алгоритм нарисовал бы логарифмическую спираль, а не окружность.
Простая рекуррентная формула для создания тригонометрических таблиц основана на формуле Эйлера и соотношении:
Это приводит к следующему рекуррентному соотношению для вычисления тригонометрических значений s n и c n , как указано выше:
для n = 0, ..., N − 1, где w r = cos(2π/ N ) и w i = sin(2π/ N ). Эти два начальных тригонометрических значения обычно вычисляются с использованием существующих библиотечных функций (но их также можно найти , например, применив метод Ньютона в комплексной плоскости для решения задачи о примитивном корне z N − 1).
Этот метод даст точную таблицу в точной арифметике, но имеет ошибки в арифметике с плавающей точкой конечной точности . Фактически, ошибки растут как O(ε N ) (как в худшем, так и в среднем случае), где ε — точность с плавающей точкой.
Значительным улучшением является использование следующей модификации вышеприведенного приема (предложенного Синглтоном [2] ), часто используемого для генерации тригонометрических значений для реализаций БПФ:
где α = 2 sin 2 (π/ N ) и β = sin(2π/ N ). Ошибки этого метода намного меньше, O(ε √ N ) в среднем и O(ε N ) в худшем случае, но это все еще достаточно много, чтобы существенно ухудшить точность БПФ больших размеров.