Partilhar via


Matemática de tipos genéricos

Para a norma ISO C 11 (C11) e posterior, o <tgmath.h> cabeçalho, além de incluir <math.h> e <complex.h>, fornece macros que invocam uma função matemática correspondente com base nos tipos dos parâmetros.

As funções matemáticas da biblioteca de tempo de execução C vêm em variantes reais e complexas. Cada variante vem em três sabores, dependendo do tipo do argumento: float, double, e long double. Como C não suporta sobrecarga como o C++, cada variante tem um nome diferente. Por exemplo, para obter o valor absoluto de um valor real de ponto flutuante, você chamaria fabsf, fabsou fabsl dependendo se está passando um float, double, ou long double valor, respectivamente. Para obter o valor absoluto complexo, você chamaria um de cabsf, cabsou cabsl dependendo se está passando um float, double, e long double um valor complexo, respectivamente. Se os argumentos não corresponderem a nenhum dos tipos acima mencionados, a função será escolhida como se os argumentos fossem duplos.

<tgmath.h> Contém macros que simplificam a seleção da função matemática certa para chamar. As macros examinam o tipo que lhes é passado e, em seguida, chamam a função correta. Por exemplo, a sqrt macro liga sqrt(9.9f) ao sqrtf(), mas liga sqrt(9.9) ao sqrt(). Se pelo menos um argumento de macro para um parâmetro genérico for complexo, então a macro liga-se a uma função complexa; caso contrário, invoca uma função real.

As macros genéricas de tipo em <tgmath.h> permitem que se escreva um código mais portátil porque não é necessário gerir as conversões de tipos ou selecionar diferentes nomes de funções, dependendo do tipo de argumento.

Essas macros estão no seu próprio cabeçalho para que os programas escritos usando o cabeçalho <math.h> não quebrem. Portanto, double x = sin(42); comporta-se como sempre se comporta quando você inclui <math.h>. Mesmo assim, espera-se que a maioria dos programas C existentes não sejam afetados quando o <tgmath.h> cabeçalho for incluído em vez de <math.h> ou <complex.h>.

A tabela a seguir lista as macros disponíveis em <tgmath.h> e em que elas se expandem. modf não está incluído nesta tabela porque não tem uma macro genérica de tipo correspondente porque não está claro como torná-la segura sem complicar a resolução de tipos.

Macro Reais
float
Reais
double
Reais
long double
Complexo
float
Complexo
double
Complexo
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

Requerimentos

Compilar com /std:c11.

Windows SDK 10.0.20348.0 (versão 2104) ou posterior. Consulte SDK do Windows para baixar o SDK mais recente. Para obter instruções sobre como instalar e usar o SDK para desenvolvimento C11 e C17, consulte Instalar suporte a C11 e C17 no Visual Studio.

Ver também

Referência da biblioteca C Run-Time