Модуль math.h
Математические операции
Модуль 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_NAN—xявляетсяNaN.FP_INFINITE—xявляется бесконечностью (±Inf).FP_ZERO—xравно 0 (±0).FP_SUBNORMAL—x— субнормальное число.FP_NORMAL—x— нормальное число.
Пример использования:
#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— число для проверки.
Возвращаемые значения:
- Ненулевое значение, если
x—NaN, иначе 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;
}