Стандартная библиотека 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 <stdio.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>, разработчики могут писать более лаконичный и более обобщённый код.

Другие расширения