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.
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 asincos
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.
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í:
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.
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.
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.
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.
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.
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