Ответ 1
Это интересный вопрос, но чтение источников эффективных библиотек не приведет вас к очень далеко, если вы не знаете, какой метод использовался.
Вот несколько указателей, которые помогут вам понять классические методы. Моя информация никоим образом не точна. Следующие методы являются только классическими, в конкретных реализациях могут использоваться другие методы.
- Часто используются таблицы поиска
- Тригонометрические функции часто реализуются с помощью алгоритма CORDIC (либо на процессоре, либо в библиотеке). Обратите внимание, что обычно синус и косинус вычисляются вместе, я всегда задавался вопросом, почему стандартная библиотека C не предоставляет функцию
sincos
. - Квадратные корни используют метод Ньютона с некоторыми умными трюками реализации: вы можете найти где-нибудь в Интернете выдержку из исходного кода Quake с умом bogging 1/sqrt (x).
- Экспоненциальные и логарифмы используют exp (2 ^ nx) = exp (x) ^ (2 ^ n) и log2 (2 ^ nx) = n + log2 (x), чтобы иметь аргумент, близкий к нулю (одному для log ) и использовать приближение рациональной функции (обычно аппроксимации Паде). Обратите внимание, что этот точный трюк может дать вам матричные экспоненты и логарифмы. Согласно @Stephen Canon, современные реализации благоприятствуют расширению Тейлора над приближением рациональной функции, где деление гораздо медленнее, чем умножение.
- Другие функции могут быть выведены из этих. Реализации могут предоставлять специализированные процедуры.
- pow (x, y) = exp (y * log (x)), поэтому pow не следует использовать, когда y является целым числом
- hypot (x, y) = abs (x) sqrt (1 + (y/x) ^ 2) если x > y (hypot (y, x) в противном случае), чтобы избежать переполнения.
atan2
вычисляется с помощью вызоваsincos
и немного логики. Эти функции являются строительными блоками для сложной арифметики. - Для других трансцендентных функций (gamma, erf, bessel,...), пожалуйста, обратитесь к отличной книге Numericical Recipes, 3rd edition для некоторых идеи. Полезен также good'old Abramowitz и Stegun. Существует новая версия http://dlmf.nist.gov/.
- В более сложных функциях используются методы, такие как приближение Чебышева, продолжение продолжения дробей (фактически связанное с аппроксимациями Паде) или экономия энергетических рядов (если вы, например, читаете исходный код для erf, bessel или gamma). Я сомневаюсь, что они действительно используют простые простые математические функции, но кто знает. Проконсультируйтесь с числовыми рецептами для обзора.