Namespaces
Variants

Type-generic math (since C99)

From cppreference.net

L'en-tête <tgmath.h> inclut les en-têtes <math.h> et <complex.h> et définit plusieurs macros génériques de type qui déterminent quelle fonction réelle ou, le cas échéant, complexe appeler en fonction des types des arguments.

Pour chaque macro, les paramètres dont le type réel correspondant dans la fonction sans suffixe <math.h> est double sont appelés paramètres génériques (par exemple, les deux paramètres de pow sont des paramètres génériques, mais seul le premier paramètre de scalbn est un paramètre générique).

Lorsqu'une macro de <tgmath.h> est utilisée, les types des arguments passés aux paramètres génériques déterminent quelle fonction est sélectionnée par la macro comme décrit ci-dessous. Si les types des arguments ne sont pas compatibles avec les types de paramètres de la fonction sélectionnée, le comportement est indéfini (par exemple, si un argument complexe est passé à une macro de <tgmath.h> qui ne prend que des réels : float complex fc ; ceil ( fc ) ; ou double complex dc ; double d ; fmax ( dc, d ) ; sont des exemples de comportement indéfini).

Note : les macros génériques de type ont été implémentées de manière définie par l'implémentation en C99, mais le mot-clé C11 _Generic permet d'implémenter ces macros de manière portable.

Table des matières

Macros génériques pour types complexes/réels

Pour toutes les fonctions qui possèdent à la fois des versions réelles et complexes, une macro générique de type XXX existe, qui appelle l'une des deux versions :

  • fonction réelle :
  • float variante XXXf
  • double variante XXX
  • long double variante XXXl
  • fonction complexe :
  • float variante cXXXf
  • double variante cXXX
  • long double variante cXXXl

Une exception à la règle ci-dessus est la macro fabs (voir le tableau ci-dessous).

La fonction à appeler est déterminée comme suit :

  • Si l'un des arguments pour les paramètres génériques est imaginaire, le comportement est spécifié individuellement sur chaque page de référence de fonction (en particulier, sin , cos , tan , cosh , sinh , tanh , asin , atan , asinh , et atanh appellent des fonctions réelles , les types de retour de sin , tan , sinh , tanh , asin , atan , asinh , et atanh sont imaginaires, et les types de retour de cos et cosh sont réels).
  • Si l'un des arguments pour les paramètres génériques est complexe, alors la fonction complexe est appelée, sinon la fonction réelle est appelée.
  • Si l'un des arguments pour les paramètres génériques est long double , alors la variante long double est appelée. Sinon, si l'un des paramètres est double ou entier, alors la variante double est appelée. Sinon, la variante float est appelée.

Les macros génériques de type sont les suivantes :

**Note:** Aucune traduction n'a été effectuée car : - Le texte "atan" est un terme spécifique au C++ (fonction mathématique) - Tous les autres textes sont contenus dans des balises ` ` (équivalent à ` `) - Les attributs HTML et les URLs ont été préservés - La structure HTML originale est maintenue
Macro générique de type
macro
Variantes de fonction
réelle
Variantes de fonction
complexe
float double long double float double long double
fabs fabsf fabs fabsl cabsf cabs cabsl
exp expf exp expl cexpf cexp cexpl
log logf log logl clogf clog clogl
puissance powf pow powl cpowf cpow cpowl
sqrt sqrtf sqrt sqrtl csqrtf csqrt csqrtl
sin sinf sin sinl csinf csin csinl
cos cosf cos cosl ccosf ccos ccosl
tan tanf tan tanl ctanf ctan ctanl
asin asinf asin asinl casinf casin casinl
acos acosf acos acosl cacosf cacos cacosl
atan atanf atan atanl catanf catan catanl
sinh sinhf sinh sinhl csinhf csinh csinhl
cosh coshf cosh coshl ccoshf ccosh ccoshl
tanh tanhf tanh tanhl ctanhf ctanh ctanhl
asinh asinhf asinh asinhl casinhf casinh casinhl
acosh acoshf acosh acoshl cacoshf cacosh cacoshl
atanh atanhf atanh atanhl catanhf catanh catanhl

Fonctions réelles uniquement

Pour toutes les fonctions qui n'ont pas d'équivalents complexes, à l'exception de modf , il existe une macro générique de type XXX , qui appelle l'une ou l'autre des variantes d'une fonction réelle :

  • float variante XXXf
  • double variante XXX
  • long double variante XXXl

La fonction à appeler est déterminée comme suit :

  • Si l'un des arguments pour les paramètres génériques est long double , alors la variante long double est appelée. Sinon, si l'un des arguments pour les paramètres génériques est double , alors la variante double est appelée. Sinon, la variante float est appelée.
**Note:** Aucune traduction n'a été effectuée car : - "erf" est un terme mathématique spécifique (fonction d'erreur) qui ne se traduit pas - Tous les textes se trouvent dans des balises ` ` (qui sont des éléments de code) - Les attributs HTML et la structure ont été préservés intacts **Note:** Aucune traduction n'a été effectuée car : - Le terme "fdim" est un terme spécifique C++ (fonction de différence positive) - Tous les textes se trouvent dans des balises ` ` qui sont équivalentes à ` ` - Les attributs HTML et le formatage ont été préservés comme demandé **Note:** Aucune traduction n'a été effectuée car : - "lgamma" est un terme spécifique au C++ (fonction mathématique) - Tous les textes se trouvent dans des balises ` ` qui sont considérées comme du code - Les attributs HTML et les balises ont été préservés comme demandé **Note:** Dans ce cas spécifique, le texte à traduire était uniquement constitué de termes techniques C++ (`lrint`, `lrintf`, `lrintl`) qui ne doivent pas être traduits selon les instructions. Les balises HTML et leur contenu ont été préservés tels quels. **Note:** Aucune traduction n'a été effectuée car : - Le texte "rint" est un terme spécifique C++ (fonction mathématique) - Tous les autres éléments sont soit des balises HTML, soit du contenu dans des balises ` ` (qui préservent le formatage) - Les attributs href et title n'ont pas été modifiés conformément aux instructions
Macro générique de type
macro
Variantes de fonction
réelle
float double long double
atan2 atan2f atan2 atan2l
cbrt cbrtf cbrt cbrtl
ceil ceilf ceil ceill
copysign copysignf copysign copysignl
erf erff erf erfl
erfc erfcf erfc erfcl
exp2 exp2f exp2 exp2l
expm1 expm1f expm1 expm1l
fdim fdimf fdim fdiml
floor floorf floor floorl
fma fmaf fma fmal
fmax fmaxf fmax fmaxl
fmin fminf fmin fminl
fmod fmodf fmod fmodl
frexp frexpf frexp frexpl
hypot hypotf hypot hypotl
ilogb ilogbf ilogb ilogbl
ldexp ldexpf ldexp ldexpl
lgamma lgammaf lgamma lgammal
llrint llrintf llrint llrintl
llround llroundf llround llroundl
log10 log10f log10 log10l
log1p log1pf log1p log1pl
log2 log2f log2 log2l
logb logbf logb logbl
lrint lrintf lrint lrintl
lround lroundf lround lroundl
nearbyint nearbyintf nearbyint nearbyintl
nextafter nextafterf nextafter nextafterl
nexttoward nexttowardf nexttoward nexttowardl
reste remainderf remainder remainderl
remquo remquof remquo remquol
rint rintf rint rintl
round roundf round roundl
scalbln scalblnf scalbln scalblnl
scalbn scalbnf scalbn scalbnl
tgamma tgammaf tgamma tgammal
tronquer truncf trunc truncl

Fonctions complexes uniquement

Pour toutes les fonctions de nombres complexes qui n'ont pas d'équivalents réels, une macro générique de type cXXX existe, qui appelle l'une ou l'autre des variantes d'une fonction complexe :

La fonction à appeler est déterminée comme suit :

  • Si l'un des arguments pour les paramètres génériques est réel, complexe ou imaginaire, alors la fonction complexe appropriée est appelée.
Macro générique de type
macro
Variantes de fonctions
complexes
float double long double
carg cargf carg cargl
conj conjf conj conjl
creal crealf creal creall
cimag cimagf cimag cimagl
cproj cprojf cproj cprojl

Exemple

#include <stdio.h>
#include <tgmath.h>
int main(void)
{
    int i = 2;
    printf("sqrt(2) = %f\n", sqrt(i)); // le type d'argument est int, appelle sqrt
    float f = 0.5;
    printf("sin(0.5f) = %f\n", sin(f)); // le type d'argument est float, appelle sinf
    float complex dc = 1 + 0.5*I;
    float complex z = sqrt(dc); // le type d'argument est float complex, appelle csqrtf
    printf("sqrt(1 + 0.5i) = %f+%fi\n",
           creal(z),  // le type d'argument est float complex, appelle crealf
           cimag(z)); // le type d'argument est float complex, appelle cimagf
}

Sortie :

sqrt(2) = 1.414214
sin(0.5f) = 0.479426
sqrt(1 + 0.5i) = 1.029086+0.242934i

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.25 Mathématiques génériques de types <tgmath.h> (p: À DÉFINIR)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.25 Mathématiques génériques de type <tgmath.h> (p : 272-273)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.25 Mathématiques génériques de type <tgmath.h> (p : 373-375)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.22 Mathématiques génériques de type <tgmath.h> (p : 335-337)