Введение
Обзор тригонометрических таблиц
В математике таблицы тригонометрических функций полезны во многих областях. До появления карманных калькуляторов тригонометрические таблицы были необходимы для навигации, науки и инженерии. Вычисление математических таблиц было важной областью исследований, что привело к разработке первых механических вычислительных устройств. Современные компьютеры и карманные калькуляторы теперь генерируют значения тригонометрических функций по запросу, используя специальные библиотеки математического кода. Часто эти библиотеки используют предварительно вычисленные таблицы внутри и вычисляют требуемое значение с помощью подходящего метода интерполяции. Интерполяция простых таблиц тригонометрических функций по-прежнему используется в компьютерной графике, где может потребоваться лишь умеренная точность, а скорость часто является приоритетной. Другое важное применение тригонометрических таблиц и схем генерации – это алгоритмы быстрого преобразования Фурье (БПФ), где одни и те же значения тригонометрических функций (называемые коэффициентами поворота) должны вычисляться многократно для данного преобразования, особенно в распространенном случае, когда вычисляется множество преобразований одного и того же размера. В этом случае обращение к общим библиотечным функциям каждый раз неприемлемо медленно. Один из вариантов – вызвать библиотечные функции один раз для создания таблицы необходимых тригонометрических значений, но это требует значительной памяти для хранения таблицы. Другая возможность, поскольку требуется регулярная последовательность значений, – использовать рекуррентную формулу для вычисления тригонометрических значений «на лету». Значительные исследования были посвящены поиску точных и устойчивых рекуррентных схем для сохранения точности БПФ (которая очень чувствительна к тригонометрическим ошибкам). Тригонометрическая таблица – это, по сути, справочная диаграмма, представляющая значения синуса, косинуса, тангенса и других тригонометрических функций для различных углов. Эти углы обычно располагаются в верхнем ряду таблицы, а различные тригонометрические функции обозначаются в первом столбце слева. Чтобы найти значение конкретной тригонометрической функции для определенного угла, нужно найти строку для этой функции и следовать по ней до столбца под нужным углом.
Традиционная тригонометрия включает в себя несколько простых шагов
Определите конкретный угол, для которого необходимо найти значения тригонометрических функций. Найдите этот угол на горизонтальной оси (верхний ряд) таблицы. Выберите нужную тригонометрическую функцию из вертикальной оси (первый столбец). Проведите линию от выбранной функции вправо и от нужного угла вниз до точки их пересечения в таблице; число в этой точке и будет значением тригонометрической функции для данного угла.
Вычисления по требованию
Современные компьютеры и калькуляторы используют различные методы для вычисления значений тригонометрических функций по требованию для произвольных углов (Kantabutra, 1996). Один из распространенных методов, особенно на высокопроизводительных процессорах с блоками операций с плавающей запятой, заключается в комбинировании полиномиального или рационального приближения (такого как приближение Чебышева, наилучшее равномерное приближение, приближение Паде, и, как правило, для более высокой или переменной точности, ряды Тейлора и Лорана) с приведением к меньшему диапазону и поиском в таблице — сначала они находят ближайший угол в небольшой таблице, а затем используют полином для вычисления поправки. Обеспечение точности при такой интерполяции — нетривиальная задача, но для этого могут использоваться такие методы, как точные таблицы Галя, приведение диапазона Коди и Уэйта, а также алгоритмы приведения радиана Пейна и Ханека. На более простых устройствах, не имеющих аппаратного умножителя, существует алгоритм CORDIC (а также связанные с ним методы), который более эффективен, поскольку использует только сдвиги и сложения. Все эти методы обычно реализуются аппаратно для повышения производительности. Конкретный полином, используемый для приближения тригонометрической функции, генерируется заранее с использованием некоторого приближения алгоритма минимаксного приближения. Для вычислений с очень высокой точностью, когда скорость сходимости разложения в ряд становится слишком низкой, тригонометрические функции могут быть аппроксимированы с помощью среднегеометрического, которое само аппроксимирует тригонометрическую функцию (комплексным) эллиптическим интегралом (Brent, 1976). Тригонометрические функции углов, являющихся рациональными кратами 2π, являются алгебраическими числами. Значения для a/b·2π можно найти, применив тождество де Муавра для n = a к b-му корню из единицы, который также является корнем полинома x<sup>b</sup> - 1 в комплексной плоскости. Например, косинус и синус 2π ⋅ 5/37 являются, соответственно, действительной и мнимой частями 5-й степени 37-го корня из единицы cos(2π/37) + sin(2π/37)i, который является корнем полинома степени 37 x<sup>37</sup> − 1. В этом случае алгоритм поиска корней, такой как метод Ньютона, намного проще, чем алгоритмы среднегеометрического, при этом сходится с аналогичной асимптотической скоростью. Однако последние алгоритмы необходимы для трансцендентных тригонометрических констант.
Формулы полуугольника и углового сложения
Исторически, самым ранним методом вычисления тригонометрических таблиц, и, вероятно, наиболее распространенным до появления компьютеров, было многократное применение тригонометрических тождеств половинного угла и сложения углов, начиная с известного значения (например, sin(π/2) = 1, cos(π/2) = 0). Этот метод использовал древний астроном Птолемей, который вывел их в "Альмагесте" – трактате по астрономии. В современной форме тождества, которые он вывел, формулируются следующим образом (знаки определяются квадрантом, в котором находится x):
Они использовались для построения таблицы хорд Птолемея, которая применялась для решения астрономических задач. Возможны и другие варианты этих тождеств: например, в некоторых ранних тригонометрических таблицах использовались не синус и косинус, а синус и версинус.