Freigeben über


Typgenerische Mathematik

Für ISO C Standard 11 (C11) und höher stellt der <tgmath.h> Header zusätzlich zum Einschließen und <complex.h>Bereitstellen <math.h> von Makros, die eine entsprechende mathematische Funktion basierend auf den Parametertypen aufrufen, bereit.

Mathematische C-Laufzeitbibliotheksfunktionen kommen in echten und komplexen Varianten. Jede Variante kommt in drei Varianten, je nach Art des Arguments: float, , doubleund long double. Da C die Überladung wie C++ nicht unterstützt, weist jede Variante einen anderen Namen auf. Um z. B. den absoluten Wert eines echten Gleitkommawerts abzurufen, rufen Sie entweder fabsf, oder fabsfabsl je nachdem, ob Sie einen float, doubleoder long double einen Wert übergeben. Um den komplexen absoluten Wert zu erhalten, rufen Sie einen von cabsf, cabsoder cabsl je nachdem, ob Sie einen float, double, bzw long double . komplexen Wert übergeben. Wenn die Argumente nicht mit einem der oben genannten Typen übereinstimmen, wird die Funktion so ausgewählt, als ob die Argumente doppelt waren.

<tgmath.h> enthält Makros, die die Auswahl der richtigen mathematischen Funktion vereinfachen, die aufgerufen werden soll. Die Makros untersuchen den Typ, den sie übergeben werden, und rufen dann die richtige Funktion auf. Beispielsweise bindet das sqrt Makro an sqrtf()sqrt(9.9f) , aber es wird an sqrt(9.9) sqrt(). Wenn mindestens ein Makroargument für einen generischen Parameter komplex ist, bindet das Makro an eine komplexe Funktion. andernfalls wird eine echte Funktion aufgerufen.

Die Typgenerika-Makros <tgmath.h> ermöglichen es Ihnen, portierbareren Code zu schreiben, da Sie die Umwandlung oder Auswahl unterschiedlicher Funktionsnamen nicht je nach Argumenttyp verwalten müssen.

Diese Makros befinden sich in ihrer eigenen Kopfzeile, sodass Programme, die mit der <math.h> Kopfzeile geschrieben wurden, nicht umbrechen. Verhält sich also double x = sin(42); wie immer, wenn Sie math.h> einschließen<. Dennoch werden die meisten vorhandenen C-Programme erwartet, dass sie nicht betroffen sind, wenn der <tgmath.h> Header anstelle von <math.h> oder <complex.h>.

In der folgenden Tabelle sind die Makros aufgeführt, in <tgmath.h> denen sie verfügbar sind und auf welche Elemente sie erweitert werden. modf ist in dieser Tabelle nicht enthalten, da es nicht über ein entsprechendes typgeneratives Makro verfügt, da es nicht klar ist, wie es sicher ist, ohne die Typauflösung zu erschweren.

Makro Wirklich
float
Wirklich
double
Wirklich
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

Anforderungen

Kompilieren Sie mit /std:c11.

Windows SDK 10.0.20348.0 (Version 2104) oder höher. Informationen zum Herunterladen des neuesten SDK finden Sie unter Windows SDK. Anweisungen zum Installieren und Verwenden des SDK für die C11- und C17-Entwicklung finden Sie unter Installieren der Unterstützung für C11 und C17 in Visual Studio.

Siehe auch

C-Laufzeitbibliotheksreferenz