Стандартная библиотека C<tgmath.h>
<tgmath.h>является заголовочным файлом в стандартной библиотеке C, предоставляющимТипогенерические математические функции(Типогенерические математические функции)。
<tgmath.h>Библиотека была введена в стандарте C99, позволяя разработчикам использовать унифицированные имена функций для вызова различных типов математических функций (таких какfloat、doubleиlong double), без необходимости явно указывать конкретный тип функции.
<tgmath.h>Основная цель:
-
Она упрощает использование математических функций, избегая необходимости определять отдельные функции для разных типов (таких как
float、double、long double) явно вызывать разные функции (например,sinf、sin、sinl)。 -
Повышает читаемость и сопровождаемость кода.
-
Математические функции, поддерживающие комплексные типы.
1, Макросы, обобщённые по типу
<tgmath.h>Она определяет набор макросов, обобщённых по типу, которые автоматически выбирают правильную математическую функцию на основе типа аргумента. Например:
-
sin(x): еслиxДаfloat, затем вызватьsinf(x); еслиxДаdouble, затем вызватьsin(x); еслиxДаlong double, затем вызватьsinl(x)。 -
sqrt(x): еслиxДаfloat, затем вызватьsqrtf(x); еслиxДаdouble, затем вызватьsqrt(x); еслиxДаlong double, затем вызватьsqrtl(x)。
Эти макросы поддерживают аргументы следующих типов:
-
Вещественные типы:
float、double、long double。 -
Комплексные типы:
float complex、double complex、long double complex。
2, Поддерживаемые функции
<tgmath.h>Поддерживаются следующие типонезависимые математические функции:
Основные математические функции
| Функция | Описание |
|---|---|
sin |
Функция синуса |
cos |
Функция косинуса |
tan |
Функция тангенса |
asin |
Функция арксинуса |
acos |
Функция арккосинуса |
atan |
Функция арктангенса |
atan2 |
Функция арктангенса с двумя аргументами |
sinh |
Функция гиперболического синуса |
cosh |
Функция гиперболического косинуса |
tanh |
Функция гиперболического тангенса |
asinh |
Функция обратного гиперболического синуса |
acosh |
Функция обратного гиперболического косинуса |
atanh |
Функция обратного гиперболического тангенса |
Экспоненциальные и логарифмические функции
| Функция | Описание |
|---|---|
exp |
Экспоненциальная функция |
log |
Функция натурального логарифма |
log10 |
Функция десятичного логарифма |
pow |
функция возведения в степень |
Другие функции
| Функция | Описание |
|---|---|
sqrt |
функция квадратного корня |
fabs |
Функция абсолютного значения |
ceil |
Функция округления вверх |
floor |
Функция округления вниз |
fmod |
Функция остатка для чисел с плавающей запятой |
3, Пример
Ниже приведён пример использования<tgmath.h>является примером, демонстрирующим, как использовать обобщённые математические функции:
Пример
#include <tgmath.h>
int main() {
// вещественные типы
float f = 1.5f;
double d = 2.5;
long double ld = 3.5L;
// используйте обобщённые по типу функции
printf("sin(f) = %f\n", sin(f)); // вызов sinf
printf("sin(d) = %f\n", sin(d)); // вызов sin
printf("sin(ld) = %Lf\n", sin(ld)); // вызов sinl
// комплексные типы
double complex z = 1.0 + 2.0 * I;
// используйте обобщённые по типу функции
double complex sqrt_z = sqrt(z);
printf("sqrt(z) = %f + %fi\n", creal(sqrt_z), cimag(sqrt_z));
return 0;
}
Вывод результата:
sin(f) = 0.997495 sin(d) = 0.598472 sin(ld) = 0.350783 sqrt(z) = 1.272020 + 0.786151i
4, Примечания
-
<tgmath.h>Это доступно только в C99 и более поздних версиях. -
Макросы, обобщённые по типу, автоматически выбирают правильную функцию на основе типа аргумента, поэтому тип аргумента должен быть ясен.
-
Если тип аргумента неоднозначен (например, целочисленная константа), компилятор может выбрать используемую по умолчанию
doubleверсию. -
Функции для комплексных типов должны включать
<complex.h>Заголовочный файл.
5, Принцип реализации
<tgmath.h>Реализация основана на механизме обобщённого выбора C (_Genericключевое слово). Например,sinОпределение макроса может быть следующим:
#define sin(x) _Generic((x), \
float: sinf, \
double: sin, \
long double: sinl \
)(x)
_Genericключевое слово, которое на основеxтипа выбирает правильную функцию.
<tgmath.h>Он предоставляет математические функции, обобщённые по типу, упрощая вызовы для различных числовых типов (таких какfloat、double、long doubleи комплексных типов). Это важная особенность стандарта C99, особенно подходящая для научных вычислений и инженерных приложений, которым необходимо работать с несколькими числовыми типами. Используя<tgmath.h>, разработчики могут писать более лаконичный и более обобщённый код.