Любой может объяснить или показать, как функция «грех» (или «sinf», «sinl») реализована в C. Интуиция предполагает, что она должна быть где-то в математике. Но я ничего там не виделКак реализуется функция «грех»?
ответ
Там есть пара способов, которыми я могу думать справа от летучей мыши: столы
- Lookup
- Сближение через ряд Тейлора (которые могут быть легко сделаны с точностью до числа значащих цифр).
Для аппроксимации полной функции см. Анализ Фурье. –
И спасибо за ссылку. Мне любопытно, однако, можно ли просто использовать две серии: одну локально вокруг 0 и одну локально вокруг PI/2? Затем вы можете просто разделить свой домен на регионы, которые должны быть рассчитаны функцией A и областями, которые должны быть вычислены функцией B. Однако я, вероятно, забываю о каком-то фундаментальном аспекте серии Taylor. –
Вы можете разделить домен на столько интервалов, сколько захотите, это действительно один из методов торговли пространством (эти коэффициенты полинома должны быть где-то сохранены) и время (выбор правильного интервала и загрузка коэффициентов с пропуском кеша) для точности, но на любом одном интервале коэффициенты, вычисленные с помощью алгоритма Ремеза, все равно будут выходить за пределы расширения Тейлора. Так вот что используется. –
Что вы подразумеваете под «осознанным»? И содержание math.h отличается на разных платформах компиляции, поэтому нет общего ответа. Обычно он может включать заголовки, зависящие от ОС или аппаратных средств, и удачу, следуя цепочке #includes вплоть до того, что вы ищете. –
В 'math.h' вы можете видеть только декларации (e.h. подписи) функций, а не их определения (например, тела функций). Ознакомьтесь с источниками 'glibc', где вы можете найти реализацию. И да, 'sin' использует быстрый алгоритм (не наивные, необходимые математические навыки) – maverik
http://en.wikipedia.org/wiki/Taylor_series –