Математические функции языка С

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

Для использования всех математических функций в программу необходимо включить заголовок <math.h>. Помимо объявления математических функций, этот заголовок определяет один или несколько макросов. В версии С89 заголовком <math.h> определяется только макрос 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. Эти макросы опре деляются заголовком <math.h>
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 также используются математическими функциями. Эти макросы определены в заголовке <errno.h>.

Ошибки в версиях С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 - Возвращает усеченное значение аргумента