Compartir por


Matemáticas de tipo genérico

Para ISO C Standard 11 (C11) y versiones posteriores, el encabezado <tgmath.h>, además de incluir <math.h> y <complex.h>, proporciona macros que invocan una función matemática correspondiente basada en los tipos de los parámetros.

Las funciones matemáticas de la biblioteca en tiempo de ejecución de C vienen en variantes reales y complejas. Cada variante viene en tres tipos, según el tipo del argumento: float, double y long double. Dado que C no admite sobrecargas como C++, cada variante tiene un nombre diferente. Por ejemplo, para obtener el valor absoluto de un valor de punto flotante real, llamaría a fabsf, fabs o fabsl dependiendo de si se pasa un valor float, double o long double, respectivamente. Para obtener el valor absoluto complejo, llamaría a cabsf, cabs o cabsl según si se pasa un valor complejo float, double y long double respectivamente. Si los argumentos no coinciden con ninguno de los tipos mencionados anteriormente, se elige la función como si los argumentos fueran dobles.

<tgmath.h> contiene macros que simplifican la selección de la función matemática correcta a la que se va a llamar. Las macros examinan el tipo que se pasan y, luego, llaman a la función correcta. Por ejemplo, la macro sqrt se enlaza sqrt(9.9f) a sqrtf(), pero se enlaza sqrt(9.9) a sqrt(). Si al menos un argumento de macro de un parámetro genérico es complejo, la macro se enlaza a una función compleja; de lo contrario, invoca una función real.

Las macros genéricas de tipo en <tgmath.h> permiten escribir código más portable porque no es necesario administrar la conversión ni seleccionar nombres de función diferentes dependiendo del tipo de argumento.

Estas macros están en su propio encabezado para que los programas escritos con el encabezado <math.h> no se interrumpan. Por lo tanto, double x = sin(42); se comporta como siempre ha hecho cuando se incluye <math.h>. Incluso así, se espera que la mayoría de los programas de C existentes no se vean afectados cuando se incluye el encabezado <tgmath.h> en lugar de <math.h> o <complex.h>.

En la tabla siguiente se enumeran las macros que están disponibles en <tgmath.h> y a las que se expanden. modf no se incluye en esta tabla porque no tiene una macro genérica de tipos correspondiente, ya que no está claro cómo hacerla segura sin complicar la resolución de tipos.

Macro Real
float
Real
double
Real
long double
Complejo
float
Complejo
double
Complejo
long double
acos acosf acos acosl cacosf cacos cacosl
acosh acoshf acosh acoshl cacoshf cacosh cacoshl
asin asinf asin asinl casinf casin casinl
asinh asinhf asinh asinhl casinhf casinh casinhl
atan atanf atan atanl catanf catan catanl
atanh atanhf atanh atanhl catanhf catanh catanhl
cos cosf cos cosl ccosf ccos ccosl
cosh coshf cosh coshl ccoshf ccosh ccoshl
exp expf exp expl cexpf cexp cexpl
fabs fabsf fabs fabsl cabsf cabs cabsl
log logf log logl clogf clog clogl
pow powf pow powl cpowf cpow cpowl
sin sinf sin sinl csinf csin csinl
sinh sinhf sinh sinhl csinhf csinh csinhl
sqrt sqrtf sqrt sqrtl csqrtf csqrt csqrtl
tan tanf tan tanl ctanf ctan ctanl
tanh tanhf tanh tanhl ctanhf ctanh ctanhl
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 - - -
remainder 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 - - -
trunc truncf trunc truncl - - -
carg - - - cargf carg cargl
conj - - - conjf conj conjl
creal - - - crealf creal creall
cimag - - - cimagf cimag cimagl
cproj - - - cprojf cproj cprojl

Requisitos

Compile con /std:c11.

Windows SDK 10.0.20348.0 (versión 2104) o posterior. Consulte Windows SDK para descargar el SDK más reciente. Para obtener instrucciones sobre cómo instalar y usar el SDK para el desarrollo con C11 y C17, vea Instalación de la compatibilidad con C11 y C17 en Visual Studio.

Consulte también

Referencia de la biblioteca en tiempo de ejecución de C