Dela via


Typgenerisk matematik

För ISO C Standard 11 (C11) och senare <tgmath.h> innehåller rubriken, förutom att inkludera <math.h> och <complex.h>, makron som anropar en motsvarande matematisk funktion baserat på parametrarnas typer.

Matematiska funktioner för C-körtidsbiblioteket finns som reala och komplexa varianter. Varje variant finns i tre varianter, beroende på typen av argument: float, doubleoch long double. Eftersom C inte stöder överlagring som C++ gör har varje variant ett annat namn. Om du till exempel vill hämta det absoluta värdet för ett verkligt flyttalsvärde anropar du antingen fabsf, fabseller fabsl beroende på om du skickar ett float, doubleeller long double -värde. För att hämta det komplexa absoluta värdet anropar du ett av cabsf, cabseller cabsl beroende på om du skickar ett float, doublerespektive long double komplext värde. Om argumenten inte matchar någon av ovanstående typer väljs funktionen som om argumenten var dubbla.

<tgmath.h> innehåller makron som förenklar valet av rätt matematisk funktion att anropa. Makrona undersöker vilken typ de skickas och anropar sedan rätt funktion. Makrot sqrt binder sqrt(9.9f) till exempel till sqrtf(), men binder sqrt(9.9) till sqrt(). Om minst ett makroargument för en allmän parameter är komplext binder makrot till en komplex funktion. annars anropas en verklig funktion.

Med typ-generiska makron i <tgmath.h> kan du skriva mer portabel kod eftersom du inte behöver hantera gjutning eller välja olika funktionsnamn beroende på typen av argument.

Dessa makron finns i en egen rubrik så att program som skrivs med rubriken <math.h> inte bryts. Så double x = sin(42); beter sig som det alltid har gjort när du inkluderar <math.h>. Trots detta förväntas de flesta befintliga C-program inte påverkas när <tgmath.h> rubriken inkluderas i stället för <math.h> eller <complex.h>.

I följande tabell visas de makron som är tillgängliga i <tgmath.h> och vad de expanderar till. modf ingår inte i den här tabellen eftersom det inte har något motsvarande typ-generiskt makro eftersom det inte är klart hur du gör det säkert utan att komplicera typmatchningen.

Makro Verklig
float
Verklig
double
Verklig
long double
Komplex
float
Komplex
double
Komplex
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

Kravspecifikation

Kompilera med /std:c11.

Windows SDK 10.0.20348.0 (version 2104) eller senare. Se Windows SDK för att ladda ned den senaste SDK:en. Instruktioner för att installera och använda SDK för C11- och C17-utveckling finns i Installera C11- och C17-stöd i Visual Studio.

Se även

Referens för C Run-Time-bibliotek