math.h est un groupe de fonctions de la bibliothèque standard du C qui permet d'utiliser un ensemble de fonctions mathématiques de base[1],[2], utilisant des nombres à virgule flottante. Les différents standards du C les implémentent différemment, mais en restant toujours rétrocompatibles. La plupart de ces fonctions sont également disponibles dans la bibliothèque standard de C++, bien que dans un autre en-tête (les en-têtes du C sont inclus, mais uniquement pour assurer la compatibilité).

Aperçu des fonctions modifier

La plupart des fonctions sont contenues dans l'en-tête math.h (ou dans l'en-tête cmath en C++). Les fonctions qui opèrent sur les entiers, telles que abs, labs, div, ou ldiv sont par contre spécifiées dans stdlib.h (cstdlib en C++).

Toutes les fonctions qui font intervenir des angles utilisent le radian comme unité[1].

Toutes les fonctions ne sont pas présentes dans la version C89 du standard du C. Pour celles qui le sont, les fonctions n'acceptent que le type double pour les opérations sur des nombres à virgule flottante. Dans la norme C99, cette limitation a été levée en introduisant une nouvelle série de fonctions fonctionnant avec des paramètres de type float ou long double. Ces fonctions sont identifiables respectivement par le suffixe f ou l[3].

Fonction Description
abs
labs
llabs
calcule la valeur absolue d'un nombre entier
fabs calcule la valeur absolue d'un nombre de type float
div
ldiv
lldiv
calcule le quotient et le reste de la division euclidienne
fmod reste de la division de nombres à virgule flottante
remainder reste signé de l'opération de division
remquo reste signé ainsi que les trois derniers bits de l'opération de division
fma Multiplication puis addition (Multiply-accumulate)
fmax maximum des deux valeurs à virgule flottante
fmin minimum des deux valeurs à virgule flottante
fdim différence positive de deux valeurs à virgule flottante
nan
nanf
nanl
Retourne un not-a-number (NaN)
Fonctions exponentielles exp retourne e élevé à la puissance demandée
exp2 retourne 2 élevé à la puissance demandée
expm1 retourne e élevé à la puissance demandée moins 1
log calcule le logarithme naturel (en base e)
log2 calcule le logarithme binaire (en base 2)
log10 calcule le logarithme décimal (en base 10)
log1p calcule le logarithme naturel (en base e) de 1 plus le nombre donné
ilogb extrait l'exposant d'un nombre
logb extrait l'exposant d'un nombre
Fonctions puissance sqrt calcule la racine carrée
cbrt calcule la racine cubique
hypot calcule la racine carrée de la somme des carrés des deux nombres donnés
pow élève un nombre à la puissance donnée
Fonctions trigonométriques sin calcule le sinus
cos calcule le cosinus
tan calcule la tangente
asin calcule l'arc sinus
acos calcule l'arc cosinus
atan calcule l'arc tangente
atan2 calcule l'arc tangente, en utilisant le signe pour déterminer le quadrant
Fonctions hyperboliques sinh calcule le sinus hyperbolique
cosh calcule le cosinus hyperbolique
tanh calcule la tangente hyperbolique
asinh calcule l'arc sinus hyperbolique
acosh calcule l'arc cosinus hyperbolique
atanh calcule l'arc tangente hyperbolique
Fonction d'erreur et fonction gamma erf calcule la fonction d'erreur
erfc calcule la fonction d'erreur complémentaire
lgamma calcule le logarithme naturel de la valeur absolue de la fonction gamma
tgamma calcule la fonction gamma
Opérations d'arrondi ceil renvoie le nombre entier supérieur le plus proche
floor renvoie le nombre entier inférieur le plus proche
trunc retourne l'entier le plus proche dont la valeur absolue est inférieure
round
lround
llround
retourne l'entier le plus proche, suivant les règles d'arrondi
nearbyint retourne l'entier le plus proche en utilisant la méthode d'arrondi courante
rint
lrint
llrint
retourne l'entier le plus proche en utilisant la méthode d'arrondi courante avec exception si le résultat diffère
Fonctions de manipulation de nombres à virgule flottante frexp décompose le paramètre en un nombre et une puissance de 2
ldexp multiplie un nombre par un nombre élevé à une puissance de 2
modf décompose un nombre en un entier et sa partie fractionnelle.
scalbn
scalbln
multiplie un nombre par FLT_RADIX élevé à une puissance donnée
nextafter
nexttoward
retourne la prochaine valeur représentable en virgule flottante
copysign copie le signe d'un nombre à virgule flottante
Classification fpclassify catégorise une valeur en virgule flottante
isfinite vérifie si le nombre donné a une valeur finie
isinf vérifie si le nombre donné a une valeur infinie
isnan vérifie si le nombre donné est NaN
isnormal vérifie si le nombre donné est normal
signbit vérifie si le nombre donné est négatif

Environnement en virgule flottante modifier

C99 ajoute plusieurs fonctions et types pour contrôler plus finement l’environnement en virgule flottante[4]. Ces fonctions peuvent être utilisées pour contrôler un certain nombre de paramètres qui affectent le calcul avec des nombres à virgule flottante, par exemple le mode d'arrondi, quand les nombres doivent être remis à zéro, etc. Ces fonctions sont définies dans l'en-tête fenv.h (cfenv en C++).

Fonction Description
feclearexcept retire les exceptions (C99)
fegetenv enregistre l'environnement actuel (C99)
fegetexceptflag enregistre les flags de statut (C99)
fegetround récupère la direction actuelle de l'arrondi (C99)
feholdexcept enregistre l'environnement actuel et nettoie les exceptions (C99)
feraiseexcept soulève une exception (C99)
fesetenv met en place un environnement (C99)
fesetexceptflag met en place un flag de statut (C99)
fesetround choisi la direction de l'arrondi (C99)
fetestexcept test si certaines exceptions ont été soulevées (C99)
feupdateenv restaure un environnement en conservant les exceptions soulevées  (C99)

Nombres complexes modifier

C99 ajoute le nouveau mot-clé _Complex (et la macro complex pour plus de commodité) qui permet de gérer des nombres complexes. Ceux-ci se présentent sous la forme de deux nombres à virgule flottante.

C++ ne propose pas de rétro-compatibilité concernant les nombres complexes, mais fournit la classe std::complex.

Toutes les opérations sur des nombres complexes sont définies dans l'en-tête complex.h. Comme pour les fonctions sur les entiers, les suffixes f et l sont les variantes de la fonction utilisant respectivement les types float complex et long double complex.

Fonction Description
Opérations de base cabs calcule la valeur absolue (C99)
carg calcule l'argument(C99)
cimag renvoie la partie imaginaire d'un nombre complexe (C99)
creal renvoie la partie réelle d'un nombre complexe (C99)
conj renvoie le  conjugué d'un nombre complexe (C99)
cproj calcule la projection du nombre complexe sur la sphère de Riemann (C99)
Opérations exponentielles cexp calcule l'exponentiel d'un nombre complexe (C99)
clog calcule le logarithme d'un nombre complexe (C99)
csqrt calcule la racine carrée d'un nombre complexe (C99)
cpow calcule la puissance d'un nombre complexe (C99)
Opérations trigonométriques csin calcule le sinus d'un nombre complexe (C99)
ccos calcule le cosinus d'un nombre complexe (C99)
ctan calcule la tangente d'un nombre complexe (C99)
casin calcule l'arc sinus d'un nombre complexe (C99)
cacos calcule l'arc cosinus d'un nombre complexe (C99)
catan calcule l'arc tangente d'un nombre complexe (C99)
Opérations hyperboliques csinh calcule le sinus hyperbolique d'un nombre complexe (C99)
ccosh calcule le cosinus hyperbolique d'un nombre complexe (C99)
ctanh calcule la tangente hyperbolique d'un nombre complexe (C99)
casinh calcule l'arc sinus hyperbolique d'un nombre complexe (C99)
cacosh calcule l'arc cosinus hyperbolique d'un nombre complexe (C99)
catanh calcule l'arc tangente hyperbolique d'un nombre complexe (C99)

Génération de nombres aléatoires modifier

L'en-tête stdlib.h (cstdlib en C++) définit plusieurs fonctions qui peuvent être utilisées pour de la génération statique de nombres aléatoires[5].

Fonction Description
rand génère un nombre pseudo-aléatoire
srand initialise un générateur de nombres pseudo-aléatoires

libm modifier

Sous Linux et FreeBSD, les fonctions mathématiques (telles que déclarées dans math.h) sont regroupées séparément dans la bibliothèque mathématique libm. Donc si l'une de ces fonctions est utilisée, la directive -lm doit être ajoutée à l'éditeur de liens.

Notes et références modifier

  1. a et b (en) ISO/IEC 9899 : 1999 specification (lire en ligne), p. 212, § 7.12.
  2. (en) Stephen Prata, C primer plus : Includes Index, Sams Publishing, , 959 p. (ISBN 0-672-32696-5), Appendix B, Section V: The Standard ANSI C Library with C99 Additions.
  3. Stephen Prata, C primer plus : Includes Index, Sams Publishing, , 959 p. (ISBN 0-672-32696-5), Appendix B, Section VIII: C99 Numeric Computational Enhancements.
  4. (en) Stephen Prata, C primer plus : Includes Index, Sams Publishing, , 959 p. (ISBN 0-672-32696-5), Appendix B, Section VIII: C99 Numeric Computational Enhancements.
  5. « The GNU C Library – ISO Random » (consulté le ).

Liens externes modifier