Модуль math.h предоставляет стандартные функции языка C (компилятор GCC) для выполнения математических операций, включая тригонометрические, гиперболические, экспоненциальные, логарифмические функции, а также функции округления, классификации чисел и работы с модулем. Функции делятся на версии для типов float (с суффиксом f) и double (без суффикса). Также включены функции для классификации чисел с плавающей точкой и проверки их свойств.

Для работы с модулем math.h реализованы следующие функции:

  // Тригонометрические функции
float acosf(float x);
float asinf(float x);
float atanf(float x);
float atan2f(float y, float x);
float cosf(float x);
float sinf(float x);
float tanf(float x);
double acos(double x);
double asin(double x);
double atan(double x);
double atan2(double y, double x);
double cos(double x);
double sin(double x);
double tan(double x);

// Гиперболические функции
float acoshf(float x);
float asinhf(float x);
float atanhf(float x);
double acosh(double x);
double asinh(double x);
double atanh(double x);

// Экспоненциальные и логарифмические функции
float expf(float x);
float logf(float x);
float log10f(float x);
float powf(float x, float y);
float sqrtf(float x);
double exp(double x);
double log(double x);
double log10(double x);
double pow(double x, double y);
double sqrt(double x);

// Функции округления
float ceilf(float x);
float floorf(float x);
float fmodf(float x, float y);
float roundf(float x);
float truncf(float x);
double ceil(double x);
double floor(double x);
double fmod(double x, double y);
double round(double x);
double trunc(double x);

// Функции с fused multiply-add
float fmaf(float x, float y, float z);
double fma(double x, double y, double z);

// Функции для работы с модулем и сравнения
float __fabsf(float x);
float fmaxf(float x, float y);
float fminf(float x, float y);
double fabs(double x);
double fmax(double x, double y);
double fmin(double x, double y);

// Функции классификации чисел
int fpclassify(float x);
int isfinite(float x);
int isinf(float x);
int isnan(float x);
int isnormal(float x);
int signbit(float x);
  
  • Функции с суффиксом f работают с типом float, без суффикса — с типом double.
  • Аргументы и возвращаемые значения функций, работающих с числами с плавающей точкой, могут быть NaN (не число), ±Inf (бесконечность) или ±0, если не указано иное.
  • При возникновении ошибок (например, вне области определения) функции могут устанавливать errno (например, EDOM для ошибок домена, ERANGE для переполнения).
  • Для использования функций необходимо подключить заголовочный файл <math.h> и, в некоторых системах, указать флаг компиляции -lm для линковки с математической библиотекой.
  • Функции классификации (fpclassify, isfinite, isinf, isnan, isnormal, signbit) работают с типом float, но аналогичное поведение применимо к double через соответствующие макросы или преобразование типов.

acosf

acos

Функции float acosf(float x) и double acos(double x) вычисляют арккосинус (обратный косинус) значения x.

Параметры:

  • x — значение в диапазоне [-1, 1].

Возвращаемые значения:

  • Арккосинус x в радианах (диапазон [0, π]) или NaN, если x вне [-1, 1].

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.5f;
    float res = acosf(x);
    printf("acosf(%.2f) = %.6f радиан\n", x, res); // Ожидается: acosf(0.50) = 1.047198 радиан
    return 0;
}
  

asinf

asin

Функции float asinf(float x) и double asin(double x) вычисляют арксинус (обратный синус) значения x.

Параметры:

  • x — значение в диапазоне [-1, 1].

Возвращаемые значения:

  • Арксинус x в радианах (диапазон [-π/2, π/2]) или NaN, если x вне [-1, 1].

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.5f;
    float res = asinf(x);
    printf("asinf(%.2f) = %.6f радиан\n", x, res); // Ожидается: asinf(0.50) = 0.523599 радиан
    return 0;
}
  

atanf

atan

Функции float atanf(float x) и double atan(double x) вычисляют арктангенс (обратный тангенс) значения x.

Параметры:

  • x — любое действительное число.

Возвращаемые значения:

  • Арктангенс x в радианах (диапазон [-π/2, π/2]).

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.0f;
    float res = atanf(x);
    printf("atanf(%.2f) = %.6f радиан\n", x, res); // Ожидается: atanf(1.00) = 0.785398 радиан
    return 0;
}
  

atan2f

atan2

Функции float atan2f(float y, float x) и double atan2(double y, double x) вычисляют арктангенс отношения y/x с учётом квадранта.

Параметры:

  • y — координата по оси Y.
  • x — координата по оси X.

Возвращаемые значения:

  • Угол в радианах (диапазон [-π, π]). Возвращает NaN, если оба аргумента равны 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float y = 1.0f, x = -1.0f;
    float res = atan2f(y, x);
    printf("atan2f(%.2f, %.2f) = %.6f радиан\n", y, x, res); // Ожидается: atan2f(1.00, -1.00) = 2.356194 радиан
    return 0;
}
  

cosf

cos

Функции float cosf(float x) и double cos(double x) вычисляют косинус значения x (в радианах).

Параметры:

  • x — угол в радианах.

Возвращаемые значения:

  • Косинус x в диапазоне [-1, 1].

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.0f;
    float res = cosf(x);
    printf("cosf(%.2f) = %.6f\n", x, res); // Ожидается: cosf(0.00) = 1.000000
    return 0;
}
  

sinf

sin

Функции float sinf(float x) и double sin(double x) вычисляют синус значения x (в радианах).

Параметры:

  • x — угол в радианах.

Возвращаемые значения:

  • Синус x в диапазоне [-1, 1].

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.570796f; // π/2
    float res = sinf(x);
    printf("sinf(%.6f) = %.6f\n", x, res); // Ожидается: sinf(1.570796) = 1.000000
    return 0;
}
  

tanf

tan

Функции float tanf(float x) и double tan(double x) вычисляют тангенс значения x (в радианах).

Параметры:

  • x — угол в радианах.

Возвращаемые значения:

  • Тангенс x. Возвращает NaN или бесконечность на значениях, близких к π/2 + kπ.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.785398f; // π/4
    float res = tanf(x);
    printf("tanf(%.6f) = %.6f\n", x, res); // Ожидается: tanf(0.785398) = 1.000000
    return 0;
}
  

acoshf

acosh

Функции float acoshf(float x) и double acosh(double x) вычисляют гиперболический арккосинус значения x.

Параметры:

  • x — значение в диапазоне [1, +∞).

Возвращаемые значения:

  • Гиперболический арккосинус x или NaN, если x < 1.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.0f;
    float res = acoshf(x);
    printf("acoshf(%.2f) = %.6f\n", x, res); // Ожидается: acoshf(1.00) = 0.000000
    return 0;
}
  

asinhf

asinh

Функции float asinhf(float x) и double asinh(double x) вычисляют гиперболический арксинус значения x.

Параметры:

  • x — любое действительное число.

Возвращаемые значения:

  • Гиперболический арксинус x.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.0f;
    float res = asinhf(x);
    printf("asinhf(%.2f) = %.6f\n", x, res); // Ожидается: asinhf(0.00) = 0.000000
    return 0;
}
  

atanhf

atanh

Функции float atanhf(float x) и double atanh(double x) вычисляют гиперболический арктангенс значения x.

Параметры:

  • x — значение в диапазоне (-1, 1).

Возвращаемые значения:

  • Гиперболический арктангенс x или NaN, если x вне (-1, 1).

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.5f;
    float res = atanhf(x);
    printf("atanhf(%.2f) = %.6f\n", x, res); // Ожидается: atanhf(0.50) = 0.549306
    return 0;
}
  

expf

exp

Функции float expf(float x) и double exp(double x) вычисляют экспоненту e^x.

Параметры:

  • x — любое действительное число.

Возвращаемые значения:

  • Значение e^x. Возвращает +Inf при переполнении или 0 при недостижении.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.0f;
    float res = expf(x);
    printf("expf(%.2f) = %.6f\n", x, res); // Ожидается: expf(1.00) = 2.718282
    return 0;
}
  

logf

log

Функции float logf(float x) и double log(double x) вычисляют натуральный логарифм (по основанию e) значения x.

Параметры:

  • x — значение больше 0.

Возвращаемые значения:

  • Натуральный логарифм x или NaN, если x <= 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 2.718282f;
    float res = logf(x);
    printf("logf(%.6f) = %.6f\n", x, res); // Ожидается: logf(2.718282) = 1.000000
    return 0;
}
  

log10f

log10

Функции float log10f(float x) и double log10(double x) вычисляют десятичный логарифм (по основанию 10) значения x.

Параметры:

  • x — значение больше 0.

Возвращаемые значения:

  • Десятичный логарифм x или NaN, если x <= 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 100.0f;
    float res = log10f(x);
    printf("log10f(%.2f) = %.6f\n", x, res); // Ожидается: log10f(100.00) = 2.000000
    return 0;
}
  

powf

pow

Функции float powf(float x, float y) и double pow(double x, double y) вычисляют x в степени y.

Параметры:

  • x — основание.
  • y — показатель степени.

Возвращаемые значения:

  • Значение x^y. Возвращает NaN или ±Inf в случае ошибок (например, x < 0 и дробный y).

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 2.0f, y = 3.0f;
    float res = powf(x, y);
    printf("powf(%.2f, %.2f) = %.6f\n", x, y, res); // Ожидается: powf(2.00, 3.00) = 8.000000
    return 0;
}
  

sqrtf

sqrt

Функции float sqrtf(float x) и double sqrt(double x) вычисляют квадратный корень значения x.

Параметры:

  • x — неотрицательное число.

Возвращаемые значения:

  • Квадратный корень x или NaN, если x < 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 16.0f;
    float res = sqrtf(x);
    printf("sqrtf(%.2f) = %.6f\n", x, res); // Ожидается: sqrtf(16.00) = 4.000000
    return 0;
}
  

ceilf

ceil

Функции float ceilf(float x) и double ceil(double x) округляют значение x до ближайшего целого числа, не меньшего x.

Параметры:

  • x — любое число.

Возвращаемые значения:

  • Наименьшее целое число, не меньшее x.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 3.14f;
    float res = ceilf(x);
    printf("ceilf(%.2f) = %.6f\n", x, res); // Ожидается: ceilf(3.14) = 4.000000
    return 0;
}
  

floorf

floor

Функции float floorf(float x) и double floor(double x) округляют значение x до ближайшего целого числа, не большего x.

Параметры:

  • x — любое число.

Возвращаемые значения:

  • Наибольшее целое число, не большее x.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 3.14f;
    float res = floorf(x);
    printf("floorf(%.2f) = %.6f\n", x, res); // Ожидается: floorf(3.14) = 3.000000
    return 0;
}
  

fmodf

fmod

Функции float fmodf(float x, float y) и double fmod(double x, double y) вычисляют остаток от деления x на y.

Параметры:

  • x — делимое.
  • y — делитель (не равен 0).

Возвращаемые значения:

  • Остаток от деления x на y или NaN, если y == 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 10.5f, y = 3.0f;
    float res = fmodf(x, y);
    printf("fmodf(%.2f, %.2f) = %.6f\n", x, y, res); // Ожидается: fmodf(10.50, 3.00) = 1.500000
    return 0;
}
  

roundf

round

Функции float roundf(float x) и double round(double x) округляют значение x до ближайшего целого числа.

Параметры:

  • x — любое число.

Возвращаемые значения:

  • Ближайшее целое число. При равном расстоянии до целых округляет от нуля (например, 2.5 → 3.0, -2.5 → -3.0).

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 3.6f;
    float res = roundf(x);
    printf("roundf(%.2f) = %.6f\n", x, res); // Ожидается: roundf(3.60) = 4.000000
    return 0;
}
  

truncf

trunc

Функции float truncf(float x) и double trunc(double x) усекают дробную часть значения x, возвращая ближайшее целое число в сторону нуля.

Параметры:

  • x — любое число.

Возвращаемые значения:

  • Целая часть x.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 3.6f;
    float res = truncf(x);
    printf("truncf(%.2f) = %.6f\n", x, res); // Ожидается: truncf(3.60) = 3.000000
    return 0;
}
  

fmaf

fma

Функции float fmaf(float x, float y, float z) и double fma(double x, double y, double z) выполняют операцию fused multiply-add: x * y + z с одной операцией округления.

Параметры:

  • x, y — множители.
  • z — слагаемое.

Возвращаемые значения:

  • Результат x * y + z.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 2.0f, y = 3.0f, z = 4.0f;
    float res = fmaf(x, y, z);
    printf("fmaf(%.2f, %.2f, %.2f) = %.6f\n", x, y, z, res); // Ожидается: fmaf(2.00, 3.00, 4.00) = 10.000000
    return 0;
}
  

__fabsf

fabs

Функции float __fabsf(float x) и double fabs(double x) вычисляют абсолютное значение (модуль) числа x.

Параметры:

  • x — любое число.

Возвращаемые значения:

  • Абсолютное значение x.

Примечание: __fabsf — нестандартное имя, используется в некоторых реализациях для float. Рекомендуется использовать стандартное имя fabsf.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = -5.0f;
    float res = fabsf(x);
    printf("fabsf(%.2f) = %.6f\n", x, res); // Ожидается: fabsf(-5.00) = 5.000000
    return 0;
}
  

fmaxf

fmax

Функции float fmaxf(float x, float y) и double fmax(double x, double y) возвращают максимум из двух чисел x и y.

Параметры:

  • x, y — сравниваемые числа.

Возвращаемые значения:

  • Наибольшее из x и y. Если одно из чисел — NaN, возвращается другое.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 10.0f, y = 20.0f;
    float res = fmaxf(x, y);
    printf("fmaxf(%.2f, %.2f) = %.6f\n", x, y, res); // Ожидается: fmaxf(10.00, 20.00) = 20.000000
    return 0;
}
  

fminf

fmin

Функции float fminf(float x, float y) и double fmin(double x, double y) возвращают минимум из двух чисел x и y.

Параметры:

  • x, y — сравниваемые числа.

Возвращаемые значения:

  • Наименьшее из x и y. Если одно из чисел — NaN, возвращается другое.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 10.0f, y = 20.0f;
    float res = fminf(x, y);
    printf("fminf(%.2f, %.2f) = %.6f\n", x, y, res); // Ожидается: fminf(10.00, 20.00) = 10.000000
    return 0;
}
  

fpclassify

Функция int fpclassify(float x) классифицирует число с плавающей точкой x.

Параметры:

  • x — число для классификации.

Возвращаемые значения:

  • Одно из значений:
    • FP_NANx является NaN.
    • FP_INFINITEx является бесконечностью (±Inf).
    • FP_ZEROx равно 0 (±0).
    • FP_SUBNORMALx — субнормальное число.
    • FP_NORMALx — нормальное число.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.0f / 0.0f; // NaN
    switch (fpclassify(x)) {
        case FP_NAN: printf("x is NaN\n"); break;
        case FP_INFINITE: printf("x is infinite\n"); break;
        case FP_ZERO: printf("x is zero\n"); break;
        case FP_SUBNORMAL: printf("x is subnormal\n"); break;
        case FP_NORMAL: printf("x is normal\n"); break;
    } // Ожидается: x is NaN
    return 0;
}
  

isfinite

Функция int isfinite(float x) проверяет, является ли число x конечным (не NaN и не бесконечностью).

Параметры:

  • x — число для проверки.

Возвращаемые значения:

  • Ненулевое значение, если x — конечное число, иначе 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.0f;
    if (isfinite(x)) {
        printf("Число %.2f является конечным\n", x); // Ожидается: Число 1.00 является конечным
    } else {
        printf("Число %.2f не является конечным\n", x);
    }
    return 0;
}
  

isinf

Функция int isinf(float x) проверяет, является ли число x бесконечностью (±Inf).

Параметры:

  • x — число для проверки.

Возвращаемые значения:

  • Ненулевое значение, если x — бесконечность, иначе 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.0f / 0.0f; // +Inf
    if (isinf(x)) {
        printf("Число является бесконечностью\n"); // Ожидается: Число является бесконечностью
    } else {
        printf("Число не является бесконечностью\n");
    }
    return 0;
}
  

isnan

Функция int isnan(float x) проверяет, является ли число x значением NaN.

Параметры:

  • x — число для проверки.

Возвращаемые значения:

  • Ненулевое значение, если xNaN, иначе 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 0.0f / 0.0f; // NaN
    if (isnan(x)) {
        printf("Число является NaN\n"); // Ожидается: Число является NaN
    } else {
        printf("Число не является NaN\n");
    }
    return 0;
}
  

isnormal

Функция int isnormal(float x) проверяет, является ли число x нормальным (не NaN, не бесконечностью, не субнормальным, не нулем).

Параметры:

  • x — число для проверки.

Возвращаемые значения:

  • Ненулевое значение, если x — нормальное число, иначе 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = 1.0f;
    if (isnormal(x)) {
        printf("Число %.2f является нормальным\n", x); // Ожидается: Число 1.00 является нормальным
    } else {
        printf("Число %.2f не является нормальным\n", x);
    }
    return 0;
}
  

signbit

Функция int signbit(float x) проверяет знак числа x.

Параметры:

  • x — число для проверки.

Возвращаемые значения:

  • Ненулевое значение, если x имеет отрицательный знак, иначе 0.

Пример использования:

  #include <stdio.h>
#include <math.h>

int main(void) {
    float x = -1.0f;
    if (signbit(x)) {
        printf("Число %.2f имеет отрицательный знак\n", x); // Ожидается: Число -1.00 имеет отрицательный знак
    } else {
        printf("Число %.2f имеет неотрицательный знак\n", x);
    }
    return 0;
}