Definiciones de sqrt, sin, cos, pow, etc. en cmath


Hay definiciones de funciones como sqrt(), sin(), cos(), tan(), log(), exp() (estos de matemáticas.h / cmath) disponible ?

Solo quería saber cómo funcionan.

Author: Patryk Czachurski, 2010-12-27

7 answers

Esta es una pregunta interesante, pero leer fuentes de bibliotecas eficientes no te llevará muy lejos a menos que conozcas el método utilizado.

Aquí hay algunos consejos para ayudarle a entender los métodos clásicos. Mi información no es exacta. Los siguientes métodos son solo los clásicos, implementaciones particulares pueden usar otros métodos.

  • Las tablas de búsqueda se utilizan con frecuencia
  • Las funciones trigonométricas a menudo se implementan a través de la Algoritmo CORDIC (ya sea en la CPU o con una biblioteca). Tenga en cuenta que por lo general seno y coseno se calculan juntos, siempre me pregunté por qué la biblioteca C estándar no proporciona una función sincos.
  • Las raíces cuadradas usan el método de Newton con algunos trucos de implementación inteligentes: puede encontrar en algún lugar de la web un extracto del código fuente de Quake con una implementación alucinante de 1 / sqrt(x).
  • Exponencial y logaritmos utilizan exp (2^n x) = exp (x)^(2^n) y log2 (2^n x) = n + log2 (x) para tener un argumento cercano a cero (a uno para log) y usar aproximación de función racional (normalmente aproximantes de Padé). Tenga en cuenta que este mismo truco exacto puede obtener exponenciales de matriz y logaritmos. Según @ Stephen Canon, las implementaciones modernas favorecen la expansión de Taylor sobre la aproximación de funciones racionales donde la división es mucho más lenta que la multiplicación.
  • Las otras funciones se pueden deducir de estas. Implementaciones pueden proporcionar rutina.
  • pow (x , y) = exp (y * log(x)), por lo que pow es no para ser utilizado cuando y es un entero
  • hypot(x, y) = abs(x) sqrt(1 + (y/x)^2) if x > y (hypot(y, x) otherwise) to avoid overflow. atan2 se calcula con una llamada a sincos y un poco de lógica. Estas funciones son los bloques de construcción para la aritmética compleja.
  • Para otras funciones trascendentales (gamma, erf, bessel, ...), por favor consulte el excelente libro Numerical Recipes, 3rd edition para algunas ideas. El good'old Abramowitz & Stegun también es útil. Hay una nueva versión en http://dlmf.nist.gov/.
  • Técnicas como la aproximación de Chebyshev, la expansión continua de fracciones (en realidad relacionada con las aproximantes de Padé) o la economización de series de potencias se utilizan en funciones más complejas (si lees el código fuente para erf, bessel o gamma, por ejemplo). Dudo que tengan un uso real en funciones matemáticas simples, pero quién sabe. Consulte Recetas Numéricas para un descripción.
 60
Author: Alexandre C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-28 10:45:49

Cada implementación puede ser diferente, pero puede consultar una implementación del código fuente de glibc (la biblioteca C de GNU).

Editar: La búsqueda de código de Google se ha desconectado, por lo que el viejo enlace que tenía no va a ninguna parte.

Las fuentes de la biblioteca matemática de glibc se encuentran aquí:

Http://sourceware.org/git/?p=glibc.git;a=tree;f=math;h=3d5233a292f12cd9e9b9c67c3a114c64564d72ab;hb=HEAD

 21
Author: wkl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-09 14:55:31

Echa un vistazo a cómo glibc implementa varias funciones matemáticas, llenas de magia, aproximación y ensamblaje.

 7
Author: ismail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-27 19:16:41

Definitivamente echa un vistazo a las fuentes fdlibm. Son agradables porque la biblioteca fdlibm es independiente, cada función está bien documentada con explicaciones detalladas de las matemáticas involucradas, y el código es inmensamente claro de leer.

 5
Author: Daniel Trebbien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-28 01:45:36

Habiendo mirado mucho el código matemático, yo aconsejaría no mirar glibc - el código es a menudo bastante difícil de seguir, y depende mucho de la magia glibc. La lib matemática en FreeBSD es mucho más fácil de leer, aunque de alguna manera a veces más lenta (pero no por mucho).

Para las funciones complejas, la principal dificultad son los casos fronterizos: el manejo correcto de nan/inf/0 ya es difícil para las funciones reales, pero es una pesadilla para las funciones complejas. El estándar C99 define muchos casos de esquina, algunos las funciones tienen fácilmente 10-20 cajas de esquina. Puede consultar el anexo G del documento estándar C99 actualizado para hacerse una idea. También hay un difícil con doble largo, porque su formato no está estandarizado - en mi experiencia, usted debe esperar un buen número de errores con doble largo. Con suerte, la próxima versión revisada de IEEE754 con mayor precisión mejorará la situación.

 4
Author: David Cournapeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-28 03:06:24

La mayoría del hardware moderno incluye unidades de coma flotante que implementan estas funciones de manera muy eficiente.

 0
Author: David Heffernan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-28 10:58:23

Casi siempre se implementan como llamadas al sistema. Si desea ver las fuentes, necesitará acceso a las fuentes del sistema operativo, lo que significa que necesita mirar un sistema operativo de código abierto como Linux o BSD.

 -15
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-27 19:13:00