Biblioteca estándar de C<tgmath.h>

<tgmath.h>es un archivo de encabezado de la biblioteca estándar de C que proporcionafunciones matemáticas genéricas de tipo(Type-Generic Math Functions)。

<tgmath.h>La biblioteca se introdujo en el estándar C99 y permite a los desarrolladores usar nombres de función uniformes para llamar a diferentes tipos de funciones matemáticas (comofloat、doubleylong double), sin necesidad de especificar explícitamente el tipo concreto de la función.

<tgmath.h>El propósito principal es:

  • simplificar el uso de funciones matemáticas, evitando para diferentes tipos (comofloat、double、long double) llamar explícitamente a diferentes funciones (comosinf、sin、sinl)。

  • Mejorar la legibilidad y mantenibilidad del código.

  • Admite funciones matemáticas para tipos complejos.


1, Macros genéricas de tipo

<tgmath.h>Define un conjunto de macros genéricas de tipo que seleccionan automáticamente la función matemática correcta según el tipo del argumento. Por ejemplo:

  • sin(x): sixSífloat, se llama asinf(x); sixSídouble, se llama asin(x); sixSílong double, se llama asinl(x)。

  • sqrt(x): sixSífloat, se llama asqrtf(x); sixSídouble, se llama asqrt(x); sixSílong double, se llama asqrtl(x)。

Estas macros admiten los siguientes tipos de argumentos:

  • Tipos reales:float、double、long double。

  • Tipos complejos:float complex、double complex、long double complex。


2, Funciones compatibles

<tgmath.h>Admite las siguientes funciones matemáticas genéricas de tipo:

Funciones matemáticas básicas

Función Descripción
sin Función seno
cos Función coseno
tan Función tangente
asin Función arcoseno
acos Función arcocoseno
atan Función arcotangente
atan2 Función arcotangente de dos argumentos
sinh Función seno hiperbólico
cosh Función coseno hiperbólico
tanh Función tangente hiperbólica
asinh Función arcoseno hiperbólico
acosh Función arcocoseno hiperbólico
atanh Función arcotangente hiperbólica

Funciones exponenciales y logarítmicas

Función Descripción
exp Función exponencial
log Función logaritmo natural
log10 Función logaritmo común
pow Función potencia

Otras funciones

Función Descripción
sqrt Función raíz cuadrada
fabs Función valor absoluto
ceil Función de redondeo hacia arriba
floor Función de redondeo hacia abajo
fmod Función resto de punto flotante

3, Ejemplo

A continuación se muestra un ejemplo de uso de<tgmath.h>que muestra cómo utilizar funciones matemáticas genéricas de tipo:

Ejemplo

#include <stdio.h>
#include <tgmath.h>

int main() {
    // Tipo real
    float f = 1.5f;
    double d = 2.5;
    long double ld = 3.5L;

    // Usar funciones genéricas de tipo
    printf("sin(f) = %f\n", sin(f));       // Llamar a sinf
    printf("sin(d) = %f\n", sin(d));       // Llamar a sin
    printf("sin(ld) = %Lf\n", sin(ld));    // Llamar a sinl

    // Tipo complejo
    double complex z = 1.0 + 2.0 * I;

    // Usar funciones genéricas de tipo
    double complex sqrt_z = sqrt(z);
    printf("sqrt(z) = %f + %fi\n", creal(sqrt_z), cimag(sqrt_z));

    return 0;
}

Salida:

sin(f) = 0.997495
sin(d) = 0.598472
sin(ld) = 0.350783
sqrt(z) = 1.272020 + 0.786151i

4, Notas

  • <tgmath.h>Solo está disponible en C99 y versiones posteriores.

  • Las macros genéricas de tipo seleccionan automáticamente la función correcta según el tipo del argumento, por lo que el tipo del argumento debe ser claro.

  • Si el tipo de argumento no es claro (por ejemplo, una constante entera), el compilador puede seleccionar la versióndoublepredeterminada.

  • Las funciones para tipos complejos requieren incluir<complex.h>el archivo de encabezado.


5, Principio de implementación

<tgmath.h>Su implementación depende del mecanismo de selección genérica del lenguaje C (_Genericpalabra clave). Por ejemplo,sinLa definición de la macro podría ser la siguiente:

#define sin(x) _Generic((x), \
    float: sinf,             \
    double: sin,             \
    long double: sinl        \
)(x)

_GenericLa palabra clave, segúnxel tipo, selecciona la función correcta.

<tgmath.h>proporciona funciones matemáticas genéricas de tipo, simplifica, para diferentes tipos de valores numéricos (comofloat、double、long doubley tipos complejos), las llamadas a funciones matemáticas.<tgmath.h>, los desarrolladores pueden escribir código más conciso y más general.

Otras extensiones