Я хотів би разом обчислити як синус, так і косинус значення (наприклад, створити матрицю обертання). Звичайно, я міг би їх обчислити окремо один за одним, як 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. Ця відповідь є гріхом,