¿Hay alguna definición de funciones como sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(estos de math.h/cmath) disponibles?Definiciones de raíz cuadrada, seno, coseno, prisionero de guerra, etc., en cmath
Solo quería saber cómo funcionan.
¿Hay alguna definición de funciones como sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(estos de math.h/cmath) disponibles?Definiciones de raíz cuadrada, seno, coseno, prisionero de guerra, etc., en cmath
Solo quería saber cómo funcionan.
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 ayudarlo a comprender los métodos clásicos. Mi información no es exacta. Los siguientes métodos son solo los clásicos, las implementaciones particulares pueden usar otros métodos.
sincos
.atan2
se calcula con una llamada al sincos
y un poco de lógica. Estas funciones son los bloques de construcción para la aritmética compleja.+1 para explicar realmente las matemáticas. Me sentí mucho mejor cuando me di cuenta de que las funciones trigonométricas solo se habían truncado en las expansiones de la serie Taylor.¡De lo contrario, las aproximaciones parecen una magia seria! –
+1 para métodos numéricos. – birryree
@Ben: las buenas bibliotecas generalmente no usan series truncadas de taylor; otras aproximaciones polinomiales (Minimax, Chebyshev, Padé) tienen características de error mucho más deseables y permiten obtener la misma precisión con menos operaciones aritméticas. –
Esas casi siempre se implementan como llamadas al sistema. Si quieres ver las fuentes, necesitarás acceder a las fuentes del SO, lo que significa que debes buscar un sistema operativo de código abierto como Linux o BSD.
'pecado' como un syscall? Eso sería un desperdicio de espacio en el kernel, a menos que el sistema operativo en cuestión sea extremadamente gráfico, e incluso así, sería más lento que una implementación de RTL debido al cambio de contexto. Hay * instrucciones * que pueden calcular sin, cos, etc., pero llamadas de sys? Lo dudo. – cHao
Casi nunca. Las funciones son llamadas C normales, proporcionadas por el compilador o biblioteca C. Para sistemas sin FPU, las instrucciones que utilizan estas funciones pueden ser atrapadas por el sistema operativo y luego emuladas, pero este es un caso raro. – wnoise
Funciones matemáticas implementadas como llamadas al sistema? ¿¿De Verdad?? –
Cada implementación puede ser diferente, pero puede verificar una implementación del código fuente de glibc (la biblioteca C de GNU).
editar: Google Code Search se ha desconectado, por lo que el antiguo enlace que tenía no llega a ninguna parte.
Las fuentes para la biblioteca matemática de glibc se encuentran aquí:
gracias por el interesante enlace. :-) – Nawaz
El enlace está roto ahora ... – unkulunkulu
@unkulunkulu - Actualizado con un enlace directo al repositorio git de glibc. – birryree
Tener un vistazo a cómo glibc
implementa varias funciones matemáticas, llenos de magia, la aproximación y el montaje.
Definitivamente, eche un vistazo a las fuentes fdlibm. Son agradables porque la biblioteca fdlibm es autónoma, cada función está bien documentada con explicaciones detalladas de las matemáticas involucradas, y el código es inmensamente claro de leer.
+1 para recomendar fdlibm –
Después de haber mirado mucho el código matemático, aconsejaría no mirar glibc - el código es a menudo bastante difícil de seguir, y depende mucho de la magia glibc. El math lib in FreeBSD es mucho más fácil de leer, aunque de alguna manera a veces más lento (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, algunas funciones tienen fácilmente 10-20 casos de esquina. Puede ver el anexo G de la fecha de actualización C99 standard document para tener una idea. También es difícil con el doble largo, porque su formato no está estandarizado; en mi experiencia, debe esperar bastantes errores con el doble largo. Con suerte, la próxima versión revisada de IEEE754 con precisión ampliada mejorará la situación.
Buen punto sobre las cajas de esquina. Pueden convertirse fácilmente en cuellos de botella en algunos casos (la implementación de 'ldexp' en MSVC hace que la función sea prácticamente inútil, por ejemplo) –
La mayoría del hardware moderno incluye unidades de coma flotante que implementan estas funciones de manera muy eficiente.
fdlibm proporciona implementaciones de todo eso, es de código abierto, independiente, bastante legible. No son las implementaciones más simples posibles, ya que están diseñadas para proporcionar un rendimiento decente. –
posible duplicado de [¿Cómo C calcula sin() y otras funciones matemáticas?] (Http://stackoverflow.com/questions/2284860/how-does-c-compute-sin-and-other-math-functions) –