Type-generic math (since C99)
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
-
float
variante
- fonction complexe :
-
-
float
variante
cXXXf -
double
variante
cXXX -
long
double
variante
cXXXl
-
float
variante
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, etatanhappellent des fonctions réelles , les types de retour desin,tan,sinh,tanh,asin,atan,asinh, etatanhsont imaginaires, et les types de retour decosetcoshsont 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 :
|
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.
|
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)