6.21 <tgmath.h> Type-generic Math
The header file tgmath.h
provides mappings from a generic math macro to either a
real or complex math function, defined by <math.h>
or
<complex.h>
. They allows a specific variant of some math
functions to be called, based on the type of the arguments passed to the macro. The
<math.h>
and <complex.h>
headers are
included by <tgmath.h>
.
Real functions in <math.h>
come in three variants: an unsuffixed
function, and a float
and a long double
variant,
indicated by an f
and l
suffix in the function name,
for example, sin()
, sinf()
, and
sinl()
. Complex functions in <complex.h>
all
use a c
prefix and again come in an unsuffixed variant and a
float complex
and a long double complex
variant,
indicated by an f
and l
suffix in the function name,
for example cexp()
, cexpf()
, and
cexpl()
.
For all of these real and complex functions, except for the modf()
function, a type-generic macro is defined by <tgmath.h>
. When a
type-generic macro is used, the following rules determine the called function.
If there are only c
-prefixed complex function variants of the macro,
then one of those function variants is called, regardless of the type of the argument.
Where there are real variants of the function, the following rules apply.
If any argument has long double complex
type and the
c
-prefixed complex variant of the function exists, the function using a
c
prefix and l
suffix will be called. If the
c
-prefixed variant of the function does not exist, the behavior is
undefined. Otherwise, if any argument has long double
type, the
function uses an l
suffix will be called. For example using the
acos()
type-generic macro with a long double
argument will call the acosl()
function; using the
acos()
type-generic macro with a long double
complex
argument will call the cacosl()
function.
If any argument has double complex
type and the
c
-prefixed complex variant of the function exists, the function using a
c
prefix and no suffix will be called. If the
c
-prefixed variant of the function does not exist, the behavior is
undefined. Otherwise, if any argument has double
or integer type, the
function with no suffix will be called. For example using the acos()
type-generic macro with a int
argument will call the
acos()
function; using the acos()
type-generic
macro with a double complex
argument will call the
cacos()
function.
If any argument has float complex
type and the
c
-prefixed complex variant of the function exists, the function using a
c
prefix and f
suffix will be called. If the
c
-prefixed variant of the function does not exist, the behavior is
undefined. Otherwise, if any argument has float
type, the function uses
an f
suffix will be called. For example using the
acos()
type-generic macro with a float
argument
will call the acosf()
function; using the acos()
type-generic macro with a float complex
argument will call the
cacosf()
function.
The application of these rules for all type-generic macros are indicated in the table below.
Type-generic macro used | Called function variants with all real arguments | Called function variants with at least one complex argument |
---|---|---|
acos | acos , acosf ,
acosl | cacos , cacosf ,
cacosl |
asin | asin , asinf ,
asinl | casin , casinf ,
casinl |
atan | atan , atanf ,
atanl | catan , catanf ,
catanl |
acosh | acosh , acoshf ,
acoshl | cacosh , cacoshf ,
cacoshl |
asinh | asinh , asinhf ,
asinhl | casinh , casinhf ,
casinhl |
atanh | atanh , atanhf ,
atanhl | catanh , catanhf ,
catanhl |
cos | cos , cosf ,
cosl | ccos , ccosf ,
ccosl |
sin | sin , sinf ,
sinl | csin , csinf ,
csinl |
tan | tan , tanf ,
tanl | ctan , ctanf ,
ctanl |
cosh | cosh , coshf ,
coshl | ccosh , ccoshf ,
ccoshl |
sinh | sinh , sinhf ,
sinhl | csinh , csinhf ,
csinhl |
tanh | tanh , tanhf ,
tanhl | ctanh , ctanhf ,
ctanhl |
exp | exp , expf ,
expl | cexp , cexpf ,
cexpl |
log | log , logf ,
logl | clog , clogf ,
clogl |
pow | pow , powf ,
powl | cpow , cpowf ,
cpowl |
sqrt | sqrt , sqrtf ,
sqrtl | csqrt , csqrtf ,
csqrtl |
fabs | fabs , fabsf ,
fabsl | cfabs , cfabsf ,
cfabsl |
atan2 | atan2 , atan2f ,
atan2l | undefined behavior |
cbrt | cbrt , cbrtf ,
cbrtl | undefined behavior |
ceil | ceil , ceilf ,
ceill | undefined behavior |
copysign | copysign , copysignf ,
copysignl | undefined behavior |
erf | erf , erff ,
erfl | undefined behavior |
erfc | erfc , erfcf ,
erfcl | undefined behavior |
exp2 | exp2 , exp2f ,
exp2l | undefined behavior |
expm1 | expm1 , expm1f ,
expm1l | undefined behavior |
fdim | fdim , fdimf ,
fdiml | undefined behavior |
floor | floor , floorf ,
floorl | undefined behavior |
fma | fma , fmaf ,
fmal | undefined behavior |
fmax | fmax , fmaxf ,
fmaxl | undefined behavior |
fmin | fmin , fminf ,
fminl | undefined behavior |
fmod | fmod , fmodf ,
fmodl | undefined behavior |
frexp | frexp , frexpf ,
frexpl | undefined behavior |
hypot | hypot , hypotf ,
hypotl | undefined behavior |
ilogb | ilogb , ilogbf ,
ilogbl | undefined behavior |
ldexp | ldexp , ldexpf ,
ldexpl | undefined behavior |
lgamma | lgamma , lgammaf ,
lgammal | undefined behavior |
llrint | llrint , llrintf ,
llrintl | undefined behavior |
llround | llround , llroundf ,
llroundl | undefined behavior |
log10 | log10 , log10f ,
log10l | undefined behavior |
log1p | log1p , log1pf ,
log1pl | undefined behavior |
log2 | log2 , log2f ,
log2l | undefined behavior |
logb | logb , logbf ,
logbl | undefined behavior |
lrint | lrint , lrintf ,
lrintl | undefined behavior |
lround | lround , lroundf ,
lroundl | undefined behavior |
nearbyint | nearbyint , nearbyintf ,
nearbyintl | undefined behavior |
nextafter | nextafter , nextafterf ,
nextafterl | undefined behavior |
nexttoward | nexttoward , nexttowardf ,
nexttowardl | undefined behavior |
remainder | remainder , remainderf ,
remainderl | undefined behavior |
remquo | remquo , remquof ,
remquol | undefined behavior |
rint | rint , rintf ,
rintl | undefined behavior |
round | round , roundf ,
roundl | undefined behavior |
scalbn | scalbn , scalbnf ,
scalbnl | undefined behavior |
scalbln | scalbln , scalblnf ,
scalblnl | undefined behavior |
tgamma | tgamma , tgammaf ,
tgammal | undefined behavior |
trunc | trunc , truncf ,
truncl | undefined behavior |
carg | carg , cargf ,
cargl | carg , cargf ,
cargl |
cimag | cimag , cimagf ,
cimagl | cimag , cimagf ,
cimagl |
conj | conj , conjf ,
conjl | conj , conjf ,
conjl |
cproj | cproj , cprojf ,
cprojl | cproj , cprojf ,
cprojl |
creal | creal , crealf ,
creall | creal , crealf ,
creall |