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 <stdio.h>
#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.

Weitere Erweiterungen