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 (como
float、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 <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ón
doublepredeterminada. -
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.