Existe-t-il des définitions de fonctions telles que sqrt()
, sin()
, cos()
, tan()
, log()
, exp()
(provenant de math.h/cmath)?
Je voulais juste savoir comment ils fonctionnent.
C'est une question intéressante, mais la lecture de 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 conseils pour vous aider à comprendre les méthodes classiques. Mes informations ne sont en aucun cas exactes. Les méthodes suivantes ne sont que des méthodes classiques, des implémentations particulières peuvent utiliser d'autres méthodes.
sincos
.atan2
est calculé avec un appel à sincos
et un peu de logique. Ces fonctions sont les blocs de construction de l'arithmétique complexe.Chaque implémentation peut être différente, mais vous pouvez extraire une implémentation du code source de glibc (la bibliothèque GNU C).
edit: Google Code Search a été mis hors ligne, donc mon ancien lien n'allait nulle part.
Les sources de la bibliothèque mathématique de glibc se trouvent ici:
Regardez comment glibc
implémente diverses fonctions mathématiques, pleines de magie, d'approximation et d'assemblage.
Jetez un coup d'œil aux sources fdlibm . Ils sont sympas parce que la bibliothèque fdlibm est autonome, chaque fonction est bien documentée avec des explications détaillées sur les mathématiques impliquées, et le code est extrêmement clair à lire.
Ayant beaucoup étudié le code mathématique, je vous déconseille de regarder glibc - le code est souvent très difficile à suivre et dépend beaucoup de la magie de la glibc. Le math lib dans FreeBSD est beaucoup plus facile à lire, même si parfois plus lent (mais pas beaucoup).
Pour les fonctions complexes, la principale difficulté réside dans les cas-frontière - une manipulation correcte du nan/inf/0 est déjà difficile pour des fonctions réelles, mais c’est un cauchemar pour des fonctions complexes. La norme C99 définit de nombreux cas de coin, certaines fonctions ont facilement 10 ou 20 cas de coin. Vous pouvez consulter l'annexe G du document standard à jour C99 pour vous faire une idée. Il y a aussi une difficulté avec long double, car son format n’est pas normalisé - selon mon expérience, vous devriez vous attendre à pas mal de bugs avec long double. Espérons que la prochaine version révisée de IEEE754, avec une précision accrue, améliorera la situation.
La plupart des matériels modernes incluent des unités à virgule flottante qui implémentent ces fonctions de manière très efficace.