Я хотів би разом обчислити як синус, так і косинус значення (наприклад, створити матрицю обертання). Звичайно, я міг би їх обчислити окремо один за одним, як a = cos(x); b = sin(x);
, але мені цікаво, чи існує швидший спосіб, коли потрібні обидва значення.
Редагувати: Щоб узагальнити відповіді поки що:
Влад сказав, що є команда asm, яка
FSINCOS
обчислює їх обох (майже в той самий час, що і дзвінок наFSIN
самоту)Як зауважив Chi , цю оптимізацію іноді вже робить компілятор (при використанні оптимізаційних прапорів).
CAF зазначив, що функції
sincos
іsincosf
, ймовірнодоступні і можуть бути викликані безпосередньо тількитому числіmath.h
Танаційний підхід використання оглядової таблиці обговорюється суперечливо. (Однак на моєму комп’ютері та в еталонній ситуації він працює в 3 рази швидше, ніж
sincos
майже з однаковою точністю для 32-бітних плаваючих точок.)Джоел Гудвін пов’язаний із цікавим підходом надзвичайно швидкої методики наближення з досить хорошою точністю (для мене це ще швидше, ніж огляд таблиці)
sinx ~ x-x^3/6
і cosx~1-x^2/4
як приближення, якщо вам важлива швидкість більше, ніж точність. Ви можете додавати умови в будь-якій серії, оскільки ви додасте більше ваги на точність ( en.wikipedia.org/wiki/Taylor_series прокрутіть вниз до трійчастого ряду Тейлора.) Зауважте, що це загальний спосіб наблизити будь-яку функцію, яку ви хочете, в різні n
часи. Отже, якщо у вас є якась більша функція, яка належить цим синусам і косинусом, ви отримаєте набагато більшу швидкість, якщо наблизити її замість гріха, а не незалежно.
x
близькі до якоїсь точки x_0
, а потім розгорніть свою серію Taylor навколо, x_0
а не 0. Це дасть вам чудову точність поблизу, x_0
але чим далі ви гірші результати. Ви, напевно, думали, що точність висмоктування викликає, коли ви дивитесь на заданий знак і намагаєтесь його визначити далеко не значення 0
. Ця відповідь є гріхом,