Я хотів би розширити відповідь, надану @Jason S. Використовуючи метод підрозділу домену, аналогічний описаному @Jason S та використовуючи наближення ряду Maclaurin, середнє (2-3) прискорення X через tan (), sin () , досягнуто функцій cos (), atan (), asin () та acos (), вбудованих у компілятор gcc з оптимізацією -O3. Найкращі описані нижче функції Maclaurin з наближенням досягали подвійної точності.
Для функцій tan (), sin () та cos (), а для простоти домен, що перекривається 0 до 2pi + pi / 80, ділився на 81 рівний інтервал з "точками прив'язки" в pi / 80, 3pi / 80, ..., 161пі / 80. Тоді tan (), sin () і cos () з цих 81 опорних точок були оцінені та збережені. За допомогою ідентифікацій тригерів була розроблена єдина функція серії Maclaurin для кожної функції триггера. Будь-який кут між ± нескінченністю може бути поданий до функцій наближення трійки, оскільки функції спочатку переводять кут введення в область 0 до 2пі. Цей переклад накладних витрат включений у наближення накладних витрат.
Аналогічні методи були розроблені для функцій atan (), asin () та acos (), де домен, що перекривається від -1,0 до 1,1, був розділений на 21 рівний інтервал з точками прив’язки при -19/20, -17/20, .. ., 19/20, 21/20. Тоді зберігався лише atan () з цих 21 опорних точок. Знову ж таки, за допомогою зворотних тотожних ідентичностей була розроблена єдина функція серії Маклауріна для функції atan (). Результати функції atan () потім використовувались для апроксимації asin () та acos ().
Оскільки всі функції зворотного наближення триггеру базуються на функції наближення atan (), будь-яке вхідне значення аргументу подвійної точності допускається. Однак введення аргументів для функцій апроксимування asin () та acos () прирізається до області ± 1, оскільки будь-яке значення поза ним є безглуздим.
Для перевірки апроксимуючих функцій мільярд оцінок випадкових функцій були змушені оцінювати (тобто компілятору оптимізації -O3 не було дозволено обходити щось оцінювання, оскільки якийсь обчислений результат не буде використаний.) Щоб усунути упередженість оцінки мільярда випадкових чисел та обробки результатів, вартість пробігу без оцінки будь-якої триггерної або зворотної триггерної функції була виконана спочатку. Потім цей ухил віднімався від кожного тесту для отримання більш репрезентативного наближення фактичного часу оцінки функції.
Таблиця 2. Час, витрачений в секундах на виконання зазначеної функції або функцій один мільярд разів. Оцінки отримують шляхом віднімання часових витрат на оцінку мільярда випадкових чисел, показаних у першому рядку таблиці 1, з решти рядків таблиці 1.
Час, проведений в засмазі (): 18.0515 18.2545
Час, проведений у TAN3 (): 5.93853 6.02349
Час, проведений у TAN4 (): 6.72216 6.99134
Час, витрачений у гріху () та cos (): 19.4052 19.4311
Час, проведений у SINCOS3 (): 7.85564 7.92844
Час, проведений у SINCOS4 (): 9.36672 9.57946
Час, проведений в атані (): 15,7160 15,6599
Час, проведений в ATAN1 (): 6.47800 6.55230
Час, проведений в ATAN2 (): 7.26730 7.24885
Час, проведений в ATAN3 (): 8.15299 8.21284
Час, проведений в asin () та acos (): 36.8833 36.9496
Час, проведений в ASINCOS1 (): 10.1655 9.78479
Час, проведений в ASINCOS2 (): 10.6236 10.6000
Час, проведений в ASINCOS3 (): 12,8430 12,0707
(В інтересах економії місця Таблиця 1 не показана.) У таблиці 2 наведені результати двох окремих прогонів на мільярд оцінок кожної функції наближення. Перший стовпець - це перший запуск, а другий - другий. Числа '1', '2', '3' або '4' у назвах функцій вказують на кількість термінів, які використовуються у функції серії Maclaurin для оцінки конкретного тригового або зворотного наближення тригерів. SINCOS # () означає, що і sin, і cos були оцінені одночасно. Аналогічно, ASINCOS # () означає, що і asin, і acos були оцінені одночасно. Мало зайвих накладних витрат при оцінці обох кількостей одночасно.
Результати показують, що збільшення кількості термінів трохи збільшує час виконання, як і слід було очікувати. Навіть найменша кількість термінів давала приблизно 12-14 знаків точності скрізь, за винятком наближення tan () поблизу, де його значення наближається до нескінченності. Можна було б очікувати, що навіть у функції tan () виникнуть проблеми.
Подібні результати були отримані на висококласному ноутбуці MacBook Pro в Unix та на настільному комп’ютері високого класу в Linux.