Существует ли какое-либо определение функций, такие как sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(это из math.h/CMATH) доступны?Определение SQRT, синус, косинус, пау и т.д. в CMATH
Я просто хотел знать, как они работают.
Существует ли какое-либо определение функций, такие как sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(это из math.h/CMATH) доступны?Определение SQRT, синус, косинус, пау и т.д. в CMATH
Я просто хотел знать, как они работают.
Это интересный вопрос, но чтение источников эффективных библиотек не приведет вас далеко, если вы не знаете, какой метод используется.
Вот несколько указателей, которые помогут вам понять классические методы. Моя информация никоим образом не точна. Следующие методы являются только классическими, в конкретных реализациях могут использоваться другие методы.
sincos
.atan2
вычисляется по вызову sincos
и немного логики. Эти функции являются строительными блоками для сложной арифметики.+1 для фактического объяснения математики. Я чувствовал себя намного лучше, когда понял, что триггерные функции были просто усеченными расширениями серии Тейлора.В противном случае приближения выглядят как серьезная магия! –
+1 для численных методов. – birryree
@Ben: хорошие библиотеки обычно не используют усеченные ряды Тейлора - другие полиномиальные аппроксимации (Minimax, Chebyshev, Padé) имеют гораздо более желательные характеристики ошибки и позволяют получить ту же точность с меньшим количеством арифметических операций. –
Это почти всегда реализуется как системные вызовы. Если вы хотите посмотреть источники, вам понадобится доступ к источникам ОС, а это значит, что вам нужно посмотреть на ОС с открытым исходным кодом, например на Linux или BSD.
'sin' как syscall? Это будет пустой тратой пространства ядра, если только ОС не является чрезвычайно графической, и даже тогда она будет медленнее, чем реализация RTL из-за переключения контекста. Есть * инструкции *, которые могут вычислять sin, cos и т. Д., Но syscalls? Я сомневаюсь в этом. – cHao
Почти никогда. Эти функции являются обычными вызовами C, предоставляемыми библиотекой компилятора или C. Для систем без FPU инструкции, используемые этими функциями, могут быть захвачены ОС и затем эмулированы, но это редкий случай. – wnoise
Математические функции, реализованные в виде системных вызовов? В самом деле?? –
Каждая реализация может отличаться, но вы можете проверить одну реализацию из исходного кода glibc (библиотеки GNU C).
Редактировать: Поиск в Google Code был удален в автономном режиме, поэтому старое соединение, которое у меня было, отсутствует.
Источники для математической библиотеки GLibC расположены здесь:
спасибо за интересную ссылку. :-) – Nawaz
Ссылка была разбита на данный момент ... – unkulunkulu
@unkulunkulu - Обновлено прямой ссылкой на git repo glibc. – birryree
Посмотрите, как glibc
реализует различные математические функции, полные магии, приближения и сборки.
Определенно взгляните на источники fdlibm. Они хороши, потому что библиотека fdlibm является автономной, каждая функция хорошо документирована с подробными объяснениями вовлеченной математики, и код очень понятен для чтения.
+1 для рекомендации fdlibm –
Многозначительно посмотрев на математический код, я бы посоветовал не смотреть на glibc - код часто бывает довольно сложным, и многое зависит от магии glibc. math lib in FreeBSD гораздо легче читать, если иногда иногда медленнее (но не сильно).
Для сложных функций основной трудностью являются граничные случаи - правильная обработка nan/inf/0 уже сложна для реальных функций, но это кошмар для сложных функций. Стандарт C99 определяет много угловых случаев, некоторые функции имеют легко 10-20 угловых случаев. Вы можете посмотреть приложение G обновленной версии C99 standard document, чтобы получить представление об этом. Существует также сложный с длинным двойником, потому что его формат не стандартизирован - по моему опыту, вы должны ожидать довольно много ошибок с длинным двойным. Надеемся, что новая версия IEEE754 с расширенной точностью улучшит ситуацию.
Хороший вопрос об угловых случаях. В некоторых случаях они могут легко стать узкими местами (реализация 'ldexp' на MSVC делает функцию практически бесполезной, например) –
Большинство современных аппаратных средств включают в себя модули с плавающей точкой, которые эффективно реализуют эти функции.
fdlibm обеспечивает реализацию всего этого материала и является открытым исходным кодом, автономным, достаточно читаемым. Не самые простые реализации, поскольку они предназначены для обеспечения достойной производительности. –
Возможный дубликат [Как C вычисляет sin() и другие математические функции?] (Http://stackoverflow.com/questions/2284860/how-does-c-compute-sin-and-other-math-functions) –