C-Standardbibliothek<tgmath.h>
<tgmath.h>ist eine Header-Datei in der C-Standardbibliothek und bietettypgenerische mathematische Funktionen(typgenerische mathematische Funktionen)。
<tgmath.h>Die Bibliothek wurde im C99-Standard eingeführt und ermöglicht Entwicklern, einheitliche Funktionsnamen zu verwenden, um verschiedene Typen mathematischer Funktionen aufzurufen (wie z. B.float、doubleundlong double), ohne den konkreten Typ der Funktion explizit angeben zu müssen.
<tgmath.h>Der Hauptzweck ist:
-
Sie vereinfacht die Verwendung mathematischer Funktionen und vermeidet die Notwendigkeit, separate Funktionen für verschiedene Typen zu definieren (wie z. B.
float、double、long double) explizit verschiedene Funktionen aufzurufen (z. B.sinf、sin、sinl)。 -
Verbessert die Lesbarkeit und Wartbarkeit des Codes.
-
Mathematische Funktionen, die komplexe Typen unterstützen.
1, Typengenerische Makros
<tgmath.h>Sie definiert eine Reihe typengenerischer Makros, die automatisch die richtige mathematische Funktion basierend auf dem Typ des Arguments auswählen. Zum Beispiel:
-
sin(x): wennxJafloat, dann aufrufensinf(x); wennxJadouble, dann aufrufensin(x); wennxJalong double, dann aufrufensinl(x)。 -
sqrt(x): wennxJafloat, dann aufrufensqrtf(x); wennxJadouble, dann aufrufensqrt(x); wennxJalong double, dann aufrufensqrtl(x)。
Diese Makros unterstützen Argumente der folgenden Typen:
-
Reelle Typen:
float、double、long double。 -
Komplexe Typen:
float complex、double complex、long double complex。
2, Unterstützte Funktionen
<tgmath.h>Die folgenden typgenerischen mathematischen Funktionen werden unterstützt:
Grundlegende mathematische Funktionen
| Funktion | Beschreibung |
|---|---|
sin |
Sinusfunktion |
cos |
Kosinusfunktion |
tan |
Tangensfunktion |
asin |
Arkussinusfunktion |
acos |
Arkuskosinusfunktion |
atan |
Arkustangensfunktion |
atan2 |
Arkustangensfunktion mit zwei Argumenten |
sinh |
Hyperbolische Sinusfunktion |
cosh |
Hyperbolische Kosinusfunktion |
tanh |
Hyperbolische Tangensfunktion |
asinh |
Inverse hyperbolische Sinusfunktion |
acosh |
Inverse hyperbolische Kosinusfunktion |
atanh |
Inverse hyperbolische Tangensfunktion |
Exponential- und Logarithmusfunktionen
| Funktion | Beschreibung |
|---|---|
exp |
Exponentialfunktion |
log |
Natürliche Logarithmusfunktion |
log10 |
Dekadische Logarithmusfunktion |
pow |
Potenzfunktion |
Weitere Funktionen
| Funktion | Beschreibung |
|---|---|
sqrt |
Quadratwurzelfunktion |
fabs |
Betragsfunktion |
ceil |
Aufrundungsfunktion |
floor |
Abrundungsfunktion |
fmod |
Gleitkomma-Restfunktion |
3, Beispiel
Das Folgende ist ein Beispiel unter Verwendung von<tgmath.h>ist ein Beispiel, das zeigt, wie man typgenerische mathematische Funktionen verwendet:
Beispiel
#include <tgmath.h>
int main() {
// reelle Typen
float f = 1.5f;
double d = 2.5;
long double ld = 3.5L;
// typ-generische Funktionen verwenden
printf("sin(f) = %f\n", sin(f)); // sinf aufrufen
printf("sin(d) = %f\n", sin(d)); // sin aufrufen
printf("sin(ld) = %Lf\n", sin(ld)); // sinl aufrufen
// komplexe Typen
double complex z = 1.0 + 2.0 * I;
// typ-generische Funktionen verwenden
double complex sqrt_z = sqrt(z);
printf("sqrt(z) = %f + %fi\n", creal(sqrt_z), cimag(sqrt_z));
return 0;
}
Ergebnis ausgeben:
sin(f) = 0.997495 sin(d) = 0.598472 sin(ld) = 0.350783 sqrt(z) = 1.272020 + 0.786151i
4, Hinweise
-
<tgmath.h>Es ist nur in C99 und späteren Versionen verfügbar. -
Typgenerische Makros wählen automatisch die richtige Funktion basierend auf dem Typ des Arguments aus, daher muss der Typ des Arguments eindeutig sein.
-
Wenn der Argumenttyp mehrdeutig ist (z. B. eine Integer-Konstante), kann der Compiler die Standard-
doubleVersion. -
Funktionen für komplexe Typen müssen eingebunden werden
<complex.h>Header-Datei.
5, Implementierungsprinzip
<tgmath.h>Die Implementierung beruht auf dem generischen Auswahlmechanismus von C (_GenericSchlüsselwort). Zum Beispiel,sinDie Makrodefinition kann wie folgt aussehen:
#define sin(x) _Generic((x), \
float: sinf, \
double: sin, \
long double: sinl \
)(x)
_GenericSchlüsselwort basierend aufxdes Typs, um die richtige Funktion auszuwählen.
<tgmath.h>Es bietet typgenerische mathematische Funktionen und vereinfacht Aufrufe für verschiedene numerische Typen (wie z. B.float、double、long doubleund komplexe Typen). Es ist ein wichtiges Merkmal im C99-Standard, besonders geeignet für wissenschaftliches Rechnen und technische Anwendungen, die mehrere numerische Typen verarbeiten müssen. Durch die Verwendung von<tgmath.h>, können Entwickler prägnanteren und generischeren Code schreiben.