Existe-t-il des définitions de fonctions comme sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(ceux de math.h/cmath) disponibles ?
Je voulais juste savoir comment ils fonctionnent.
Existe-t-il des définitions de fonctions comme sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(ceux de math.h/cmath) disponibles ?
Je voulais juste savoir comment ils fonctionnent.
C'est une question intéressante, mais la lecture des sources de bibliothèques efficaces ne vous mènera pas très loin si vous ne connaissez pas la méthode utilisée.
Voici quelques indications pour vous aider à comprendre les méthodes classiques. Mes informations ne sont en aucun cas exactes. Les méthodes suivantes ne sont que les méthodes classiques, des implémentations particulières peuvent utiliser d'autres méthodes.
sincos
fonction.atan2
est calculée par un appel à sincos
et un peu de logique. Ces fonctions sont les éléments constitutifs de l'arithmétique complexe.
+1 pour avoir expliqué les maths. Je me suis senti beaucoup mieux quand j'ai réalisé que les fonctions trigonométriques n'étaient que des expansions de séries de Taylor tronquées. Sinon, les approximations ressemblent à de la magie !
@Ben : les bonnes bibliothèques n'utilisent généralement pas de séries de taylor tronquées -- d'autres approximations polynomiales (Minimax, Chebyshev, Padé) ont des caractéristiques d'erreur beaucoup plus souhaitables et permettent d'obtenir la même précision avec moins d'opérations arithmétiques.
@Alexandre : l'approximation rationnelle n'est plus à la mode depuis quelques années. exp
y log
parce que la multiplication et l'addition sont beaucoup plus rapides que la division sur le matériel moderne. Elle est cependant toujours utilisée pour des fonctions plus rigides.
Chaque implémentation peut être différente, mais vous pouvez vérifier une implémentation à partir du code source de glibc (la bibliothèque C de GNU).
edit : Google Code Search a été mis hors ligne, donc l'ancien lien que j'avais ne mène nulle part.
Les sources de la bibliothèque mathématique de la glibc sont situées ici :
Regardez comment glibc
met en œuvre diverses fonctions mathématiques, pleines de magie, d'approximation et d'assemblage.
+1 pour le lien vers le logiciel source de la glibc, mais wow le site est lent en ce moment. (édité)
A priori, ce sont les versions les plus lentes avec des implémentations plus rapides dans des sous-dossiers spécifiques à l'arch.
Jetez un coup d'œil à la fdlibm sources. Elles sont agréables car la bibliothèque fdlibm est autonome, chaque fonction est bien documentée avec des explications détaillées des mathématiques impliquées, et le code est extrêmement clair à lire.
Ayant beaucoup regardé le code mathématique, je déconseille de regarder la glibc - le code est souvent assez difficile à suivre, et dépend beaucoup de la magie de la glibc. Le site librairie mathématique sous FreeBSD est beaucoup plus facile à lire, même si elle est parfois plus lente (mais pas de beaucoup).
Pour les fonctions complexes, la principale difficulté réside dans les cas limites - le traitement correct des nan/inf/0 est déjà difficile pour les fonctions réelles, mais c'est un cauchemar pour les fonctions complexes. La norme C99 définit de nombreux cas limites, certaines fonctions ont facilement 10 à 20 cas limites. Vous pouvez consulter l'annexe G de la version la plus récente de la norme C99. Document standard C99 pour se faire une idée. Il y a aussi une difficulté avec le double long, car son format n'est pas standardisé - d'après mon expérience, vous devez vous attendre à un certain nombre de bogues avec le double long. J'espère que la prochaine version révisée de la norme IEEE754 avec une précision étendue améliorera la situation.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Fdlibm fournit des implémentations de toutes ces choses, et est open-source, autonome, assez lisible. Ce ne sont pas les implémentations les plus simples possibles, puisqu'elles sont conçues pour fournir des performances décentes.
0 votes
Duplicata possible de Comment le C calcule-t-il sin() et d'autres fonctions mathématiques ?