Вы можете уменьшить размер таблицы до 25% от оригинала, сохранив только значения для первого квадранта, т. Е. Для x в [0, pi / 2].
Чтобы сделать это, вашей подпрограмме поиска необходимо сопоставить все значения x с первым квадрантом, используя простые триггерные тождества:
- sin (x) = - sin (-x), чтобы отобразить из квадранта IV в I
- sin (x) = sin (pi - x) для отображения из сектора II в I
Чтобы отобразить из квадранта III в I, примените обе тождества, то есть sin (x) = - sin (pi + x)
Способность этой стратегии зависит от того, насколько важно использование памяти в вашем случае. Но кажется бесполезным хранить в четыре раза больше значений, сколько вам нужно, только чтобы избежать сравнения и вычитания или двух во время поиска.
Я рекомендую Джереми измерить, лучше ли строить таблицу, чем просто использовать std :: sin (). Даже с оригинальной большой таблицей вам придется тратить циклы во время каждого просмотра таблицы, чтобы преобразовать аргумент в ближайший шаг приращения pi / 1000, и вы потеряете некоторую точность в процессе.
Если вы действительно пытаетесь обменять точность на скорость, вы можете попробовать аппроксимировать функцию sin (), используя только первые несколько членов расширения серии Тейлора.
- sin (x) = x - x ^ 3/3! + х ^ 5/5! ..., где ^ обозначает возведение в степень и! представляет факториал.
Конечно, для эффективности вы должны предварительно вычислить факториалы и использовать более низкие степени x для вычисления более высоких, например, используйте x ^ 3 при вычислении x ^ 5.
Одна заключительная точка, усеченная серия Тейлора, приведенная выше, более точна для значений, близких к нулю, поэтому ее все же стоит сопоставить с первым или четвертым квадрантом до вычисления приблизительного синуса.
Приложение:
Еще одно потенциальное улучшение, основанное на двух наблюдениях:
1. Вы можете вычислить любую функцию триггера, если вы можете вычислить как синус, так и косинус в первом октанте [0, pi / 4]
2. Разложение в ряд Тейлора с центром в нуле более точно вблизи нуля
Так что, если вы решите использовать усеченный ряд Тейлора, то вы можете улучшить точность (или использовать меньше терминов для аналогичной точности), сопоставив синус или косинус, чтобы получить угол в диапазоне [0, pi / 4] использование идентификаторов, таких как sin (x) = cos (pi / 2-x) и cos (x) = sin (pi / 2-x) в дополнение к указанным выше (например, если x> pi / 4, как только вы сопоставлены с первым квадрантом.)
Или, если вы решите использовать поиск таблиц как для синуса, так и для косинуса, вы можете обойтись двумя таблицами меньшего размера, которые охватывают только диапазон [0, pi / 4] за счет другого возможного сравнения и вычитания при поиске отобразить на меньший диапазон. Тогда вы могли бы использовать меньше памяти для таблиц или использовать ту же память, но обеспечить более высокую степень детализации и точности.