Справочник по C/C++
Математические функции языка С

В языках С и C++ определено множество разнообразных математических функций. Сначала оба языка поддерживали один и тот же набор, состоящий из 22 математических функций. Однако по мере развития языка C++ расширялся и арсенал определенных в нем функций. Затем в версии С99 размер математической библиотеки значительно увеличился. В результате этих изменений библиотеки математических функций языков С и C++ стали существенно отличаться одна от другой. Поэтому в данной главе описываются математические функции языка С(включая те, которые добавлены в версии С99), а в главе 9 уделено внимание исключительно функциям языка C++. При этом имейте в виду, что исходный набор математических функций по-прежнему поддерживается всеми версиями языков С и C++.

Для использования всех математических функций в программу необходимо включить заголовок . Помимо объявления математических функций, этот заголовок определяет один или несколько макросов. В версии С89 заголовком определяется только макрос HUGE_VAL, который представляет собой значение типа double, сигнализирующее о возникшем переполнении.

В версии С99 определены следующие макросы.

HUGE_VALF float-версия макроса HUGE_VAL
HUGE_VALL long double-версия макроса HUGE_VAL
INFINITY Значение, представляющее бесконечность
math_errhandling  Содержит макросы MATH_ERRNO и/или MATH_ERREXCEPT
MATH_ERRNO Встроенная глобальная переменная errno, используемая для вывода сообщений об ошибках
MATH_ERREXCEPT Исключение вещественного типа, возбуждаемое для вывода сообщения об ошибках
NAN Не число

В версии С99 определены следующие макросы(подобные функциям), которые классифицируют значение.

int fpclassify(fpval) Возвращает FP_INFINITY, FP_NAN, FP_NORMAL, FP_SUBNORMAL или FP_ZERO в зависимости от значения аргумента fpval. Эти макросы определяются заголовком
int isfinite(fpval) Возвращает ненулевое значение, если fpval имеет предел
int isinf(fpval) Возвращает ненулевое значение, если fpval не имеет предела
int isnan(fpval) Возвращает ненулевое значение, если fpval - не число
int isnormal(fpval) Возвращает ненулевое значение, если fpval является нормальным значением
int signbit(fpval) Возвращает ненулевое значение, если fpval отрицательно(т.е. установлен его знаковый разряд)

В версии С99 определены следующие макросы сравнения, аргументами которых(a и b) должны быть значения с плавающей точкой.

int isgreater(а, Ь) Возвращает ненулевое значение, если а больше Ь
int isgreaterequal(а, Ь) Возвращает ненулевое значение, если а больше или равно b
int isless(a, Ь) Возвращает ненулевое значение, если а меньше Ь
int islessequal(а, Ь) Возвращает ненулевое значение, если а меньше или равно b
int islessgreater(а, Ь) Возвращает ненулевое значение, если а больше или меньше b
int isunordered(a, Ь) Возвращает 1, если а и b неупорядочены одно относительно другого. Возвращает 0, если а и Ь упорядочены

Эти макросы прекрасно обрабатывают значения, которые не являются числами, не вызывая при этом исключений вещественного типа.

Макросы EDOM и ERANGE также используются математическими функциями. Эти макросы определены в заголовке .

Ошибки в версиях С89 и С99 обрабатываются по-разному. Так, в версии С89, если аргумент математической функции не попадает в домен, для которого он определен, возвращается некоторое значение, зависящее от конкретной реализации, а встроенная глобальная целая переменная errno устанавливается равной значению EDOM. В версии С99 ошибка нарушения границ домена также приводит к возврату значения, зависящего от конкретной реализации. Однако по значению math_errhandling можно судить о выполнении других действий. Если math_errhandling содержит значение MATH_ERRNO, встроенная глобальная целая переменная errno устанавливается равной значению EDOM. Если же math_errhandling содержит значение MATH_ERREXCEPT, возбуждается исключение вещественного типа.

В версии С89, если функция генерирует результат, который слишком велик для возможностей представления, происходит переполнение. В этом случае функция возвращает значение HUGE_VAL, а переменная errno устанавливается равной значению ERANGE, сигнализирующему об ошибке диапазона. При обнаружении потери значимости функция возвращает нуль и устанавливает переменную errno равной значению ERANGE. В версии С99 ошибка переполнения также приводит к тому, что функция возвращает значение. HUGE_VAL, а при потере значимости - нуль. Если math_errhandling содержит значение MATH_ERRNO, глобальная переменная errno устанавливается равной значению ERANGE, свидетельствующему об ошибке диапазона. Если же math_errhandling содержит значение MATH_ERREXCEPT, возбуждается исключение вещественного типа.

В версии С89 аргументами математических функций должны быть значения типа double и значения, возвращаемые функциями, имеют тип double. В версии С99 добавлены float- и long double-варианты этих функций, которые используют суффиксы f и l соответственно. Например, в версии С89 функция sin() определена следующим образом.

double sin(double arg);

В версии С99 поддерживается приведенное выше определение функции sin() и добавляются еще две ее модификации - sinf() и sinl().

float sinf(float arg);
long double sinl(long double arg);

Операции, выполняемые всеми тремя функциями, одинаковы; различаются лишь данные, подвергаемые этим операциям. Добавление f- и 1-модификаций математических функций позволяет использовать версию, которая наиболее точно соответствует вашим данным.

Поскольку в версии С99 добавлено так много новых функций, стоит отдельно перечислить функции, поддерживаемые версией С89(они также используются в языке C++).

acos asin atan atan2  ceil
cos cosh exp fabs floor
fmod  frexp  ldexp  log log10
modf pow sin sinh sqrt
tan tanh

И еще одно: все углы задаются  в радианах.


Смотрите также

acos - Возвращает значение арккосинуса
acosh - Возвращает значение гиперболического арккосинуса
asin - Возвращает значение арксинуса
asinh - Возвращает значение гиперболического арксинуса
atan - Возвращает значение арктангенса
atan2 - Возвращает значение арктангенса от а/Ь
atanh - Возвращает значение гиперболического арктангенса
cbrt - Возвращает значение кубического корня
ceil - Возвращает наименьшее целое, которое больше значения заданого аргумента
copysign - Наделяет заданный аргумент знаком, который имеет указаный аргумент
cos - Возвращает значение косинуса
cosh - Возвращает значение гиперболического косинуса
erf - Возвращает значение функции ошибок
erfc - Возвращает дополнительное значение функции ошибок
exp - Возвращает значение экспоненты
exp2 - Возвращает число 2, возведенное в заданную степень
expm1 - Возвращает уменьшенное на единицу значение натурального логарифма е
fabs - Возвращает абсолютное значение
fdim - Возвращает нуль или разность в двух заданных аргументов
floor - Возвращает наибольшее целое которое меньше или равно значению заданного аргумента
fma - Возвращает значение а*Ь+с заданных аргументов
fmax - Возвращает большее из двух значений
fmin - Возвращает меньшее из двух значений
fmod - Возвращает остаток от деления
frexp - Разбивает заданное число на мантиссу и экспоненту
hypot - Возвращает длину гипотенузы при заданных длинах двух катетов
ilogb - Выделяет экспоненциальное значение
ldexp - Возвращает значение выражения num*2^ехр.
lgamma - Вычисляет абсолютное значение гамма-функции и возвращает ее натуральный логарифм
llrint - Возвращает значение округленного до ближайшего целого
llround - Возвращает значение округленное до ближайшего целого
log - Возвращает значение натурального логарифма
log10 - Возвращает значение логарифма по основанию 10
log1p - Возвращает значение натурального логарифма для аргумента num+1
log2 - Возвращает логарифм по основанию 2
logb - Выделяет экспоненциальное значение
lrint - Возвращает значение округленное до ближайшего целого
lround - Возвращает значение округленное до ближайшего целого
modf - Разбивает аргумент num на целую и дробную части
nan - Возвращает значение, которое не является числом и которое содержит строку
nearbyint - Возвращает значение аргумента округленное до ближайшего целого
nextafter - Функция возвращает следующее после заданного аргумента значение, ближайшее к значению указанного аргумента
nexttoward - Функция возвращает следующее после заданного аргумента значение, ближайшее к значению указанного аргумента
pow - Возвращает число возведённое в степень
remainder - Возвращает остаток от деления значений двух аргументов
remquo - Возвращает остаток от деления значений двух аргументов
rint - Возвращает значение округленное до ближайшего целого
round - Возвращает значение аргумента arg, округленное до ближайшего целого
scalbln - Возвращает произведение параметра val и значения FLT_RADIX, возведенного в степень, которая равна значению параметра ехр
scalbn - Возвращает произведение заданного параметра и значения FLT_RADIX, возведенного в степень, которая равна значению параметра ехр
sin - Возвращает значение синуса
sinh - Возвращает значение гиперболического синуса
sqrt - Возвращает значение квадратного корня
tan - Возвращает значение тангенса
tanh - Возвращает значение гиперболического тангенса
tgamma - Возвращает значение гамма-функции
trunc - Возвращает усеченное значение аргумента