Next Previous Contents

13. Математика

Эта глава содержит информацию относительно функций для выполнения математических вычислений, типа тригонометрических функций. Большинство этих функций имеет прототипы, объявленные в файле "math.h".

Все функции используют аргументы с плавающей запятой и возвращают результаты типа double. В будущем, могут появиться дополнительные функции, которые используют значения long double и float. Например, cosf и cosl были бы версиями функци cos, которые используют аргументы типов float и long double, соответственно. Вы должны избегать использовать эти имена самостоятельно. См. Раздел 1.3.3 [Зарезервированные Имена].

13.1 Ошибки Области и Диапазона

Многие из функций, перечисленных в этой главе определены математически над областью, которая является только подмножеством вещественных чисел. Например, acos функция определена над областью от -1 до 1. Если Вы передаете аргумент одной из этих функций, который не находится в области, на которой она определена, функция устанавливает errno как EDOM, чтобы указать ошибку области. На машинах, которые поддерживают формат ИИЭР (IEEE) с плавающей запятой, также возвращают ошибку EDOM и NaN.

Некоторые из этих функций определены математически, чтобы привести к комплексному значению над частями их областей. Наиболее знакомый пример это квадратный корень отрицательного числа.

Функции в этой главе берут аргументы только с плавающей точкой и возвращают значения соответственно того же типа.

Проблема возникает тогда, когда математический результат функции не может быть представим как число с плавающей запятой. Если величина результата слишком большая, функция устанавливает errno как ERANGE, чтобы указать ошибку диапазона, и возвращает "очень большое значение" (именованое макрокомандой HUGE_VAL) или отрицание (- HUGE_VAL).

Если величина результата является слишком малой, возвращается нулевое значение. В этом случае, errno может быть или не быть установлена как ERANGE.

Единственый полностью надежный способ проверять ошибки области и диапазона состоит в том, чтобы установить errno как 0 прежде чем Вы вызываете математическую функцию и затем проверять errno. Следствие такого использования errno является то, что математические функции не могут быть многократно использованы с проверкой ошибок.

Ни одна из математических функций не генерирует сигналы в результате ошибок диапазона или области. В частности это означает что Вы не будете видеть сигналы SIGFPE, сгенерированные внутри этих функций. (См. Главу 21 [Обработка Сигнала], для получения более подробной информации.)

     double HUGE_VAL  (макрос)
Это выражение представляющее наибольшее число. На машинах, которые используют, ИИЭР формат с плавающей запятой это значение "бесконечность". На других машинах, это обычно самое большое положительное число, которое может быть представлено.

Значение этой макрокоманды используется как возвращаемое значение из различных математических функций в случаях переполнения.

Для получения более подробной информации см. Раздел A. 5.3.2 [Параметры с плавающей запятой]. В частности макрокоманда DBL_MAX могла бы быть более удобной, чем HUGE_VAL для многих использований отличных от тестирования ошибки в математической функции.

13.2 Тригонометрические Функции

Это знакомые функции sin, cos, и tan. Аргументы всех этих функций измеряются в радианах; помните, что pi радиан равняются 180 градусам.

Математическая библиотека не определяет символическую константу для pi, но Вы можете определять вашу собственную, если Вы нуждаетесь в этом:

    #define PI 3.14159265358979323846264338327
Вы можете также вычислять значение pi выражением acos (-1.0).

    double sin (double x)
Эта функция возвращает синус x, где x дан в радианах. Возвращаемое значение находится в диапазоне от -1 до 1.

    double cos (double x)
Эта функция возвращает косинус x, где x дан в радианах. Возвращаемое значение находится в диапазоне от -1 до 1.

    double tan (double x)
Эта функция возвращает тангенс x, где x дан в радианах.

Следующие errno условия ошибки определены для этой функции:

ERANGE

Математически функция tan имеет особенности в точках (2*k+1)*pi/2. Если аргумент x близок к одной из этих особенностей, tan устанавливает errno как ERANGE и возвращает или положительный или отрицательный HUGE_VAL.

13.3 Обратные Тригонометрические Функции

Это обычные arcsin, arccos и arctan функции, которые являются обратными для синуса, косинуса и тангенса, соответственно.

    double asin (double x)
Эта функция вычисляет арксинус x то есть значение, чей синус является x. Значение результата дается в радианах. Математически, имеется бесконечно много таких значений; но фактически возвращаются значения между -pi/2 и pi/2 (включая).

Asin устанавливает errno как EDOM, если x находится вне диапазона. Функция арксинуса определена математически только над областью от -1 до 1.

    double acos (double x)
Эта функция вычисляет аркосинус x, то есть значение, чей косинус является x. Значение результата дается в радианах. Математически, имеется бесконечно много таких значений; но фактически возвращаются значения между 0 и pi (включая).

Acos устанавливает errno как EDOM, если x находится вне диапазона. Функция аркосинуса определена математически только над областью от -1 до 1.

    double atan (double x)
Эта функция вычисляет арктангенс x то есть значение, чей тангенс является x.

Значение результата дается в радианах. Математически, имеется бесконечно много таких значений; но фактически возвращаются значения между -pi/2 и pi/2 (включая).

    double atan2 (double y, double x)
Это функция арктангенса двух аргументов. Она подобна вычислению арктангенса y/x, за исключением того, что знаки обоих аргументов используются, чтобы определить квадрант результата, и x может быть нулем. Возвращаемое значение дано в радианах и находится в диапазоне от -pi до pi (включительно).

Если x и y координаты точки в плоскости, atan2 возвращает угол между линией от начала координат до этой точки и осью X. Таким образом, atan2 полезен для преобразования декартовых координат в полярные координаты. (Чтобы вычислять радиальную координату, используйте hypot; см. Раздел 13.4 [Экспоненты и Логарифмы])

Функция atan2 устанавливает errno как EDOM, если и x и y нули и возвращаемое значение не определено.

13.4 Возведение в степень и Логарифмы

    double exp (double x)
Эта функция возвращает значение e (основание натуральных логарифмов) в степени x.

Если величина результата слишком большая, чтобы быть представимой функция устанавливает errno как ERANGE.

    double log (double x)
Эта функция возвращает натуральный логарифм x. exp (log(x)) равняется x, точно в математике и приблизительно в Cи.

Следующие условия ошибки errno определены для этой функции:

Функция устанавливает EDOM, если аргумент x отрицателен. Функция log определена математически, чтобы возвращать результат только на положительных аргументах.

Функция устанавливает ERANGE, если аргумент - нуль. Log нуля не определен.

    double log10 (double x)
Эта функция возвращает логарифм x по основанию 10. Кроме основания , она подобна функции log. Фактически, log10 (x) равняется log (x) / log (10).

    double pow (double base, double power)
Это общая функция возведения в степень, возвращающая base в степени power.

Следующие условия ошибки errnoопределены для этой функции:

Функция устанавливает EDOM base, если аргумент отрицателен.

Функция устанавливает ERANGE, если было обнаружено условие переполнения.

    double sqrt (double x)
Эта функция возвращает квадратный корень x.

Sqrt устанавливает errno как EDOM, если x отрицателен. Математически, квадратный корень был бы комплексным числом.

    double cbrt (double x)
Эта функция возвращает кубический корень x. Эта функция определена на всей вещественной оси и поэтому не изменяет переменную errno.

    double hypot (double x, double y)
Эта функция возвращает sqrt (x * x + y * y). (Это длина гипотенузы прямоугольного треугольника со сторонами длины x и y, или расстояние точки (x, y) от начала.) См. также функцию cabs в Разделе 14.3 [Абсолютное значение].

    double expm1 (double x)
Эта функция возвращает эквивалент значения exp (x) - 1. Оно вычислено точным способом, даже если значение x близко к нулю.

    double log1p (double x)
Эта функция возвращает эквивалент значения log (1 + x). Оно вычислено точным способом, даже если значение x - близко к нулю.

13.5 Гиперболические функции

Функции в этом разделе связаны с экспоненциальными функциями; см. Раздел 13.4 [Экспоненты и Логарифмы].

    double sinh (double x)  (функция)
Эта функция возвращает гиперболический синус x, определенный математически как exp (x) - exp (-x) /.2 Функция устанавливает errno как ERANGE, если значение x слишком большое; то есть если происходит переполнение.

    double cosh (double x)  (функция)
Функция cosh возвращает гиперболический косинус x, определенный математически как exp (x) + exp (-x) /.2 Функция устанавливает errno как ERANGE, если значение x слишком большое; то есть если происходит переполнение.

    double tanh (double x)  (функция)
Эта функция возвращает гиперболический тангенс x, чье математическое определение sinh (x) / cosh (x).

    double asinh (double x)  (функция)
Эта функция возвращает обратный гиперболический синус x, чей гиперболический синус является x.

    double acosh (double x)  (функция)
Эта функция возвращает обратный гиперболический косинус x, чей гиперболический косинус является x. Если x - меньше чем 1, acosh возвращает HUGE_VAL.

    double atanh (double x)  (функция)
Эта функция возвращает обратный гиперболический тангенс x, чей гиперболический тангенс является x. Если абсолютное значение x больше или равно 1, atanh возвращает HUGE_VAL.

13.6 Псевдослучайные Числа

Этот раздел описывает средства GNU для получения ряда псевдослучайных чисел. Сгенерированные числа не совсем произвольные; обычно, они формируют последовательность, которая повторяется периодически, с периодом настолько большим, что Вы можете игнорировать его для обычных целей. Генератор случайных чисел работает, используя всегда значение начального числа, чтобы вычислить следующее случайное число и так далее.

Хотя сгенерированные чисала выглядят непредсказуемо при одном выполнении программы, последовательность чисел точно та же самая и при следующем выполении. Это происходит, потому что начальное число всегда одно то же . Это удобно, когда Вы отлаживаете программу, но неподходит, если Вы хотите, чтобы программа вела себя непредсказуемо. Если Вы хотите действительно случайные числа, а не только псевдослучайными, определяйте начальное число, основываясь на текущем времени.

Вы можете получать повторяющиеся последовательности чисел на машине определенного типа, определяя то же самое начальное значение начального числа для генератора случайных чисел. Не существует никакого стандарта для значения начального числа; то же самое начальное число, используемое в различных библиотеках C или на различных типах CPU , даст Вам различные случайные числа.

Библиотека GNU поддерживает стандартные функции случайного числа ANSI C плюс набор, который происходит от BSD. Мы рекомендуем, чтобы Вы использовали стандартные rand и srand.

Функции Случайного числа ANSI C

Этот раздел описывает функции случайного числа, которые являются частью стандарта ANSI C.

Чтобы использовать эти средства, Вы должны включить заглавный файл "stdlib.h" в вашей программе.

    int RAND_MAX  (макрос)
Значение этой макрокоманды - выражение константы integer, которое представляет максимальное возможное значение, возвращенное функцией rand. В библиотеке GNU, это - 037777777, которое является самым большим целым числом со знаком, представимым в 32 битах. В других библиотеках это может быть всего 32767.

    int rand ()  (функция)
Функция rand возвращает следующее псевдослучайное число. Значение находится в диапазоне от 0 до RAND_MAX.

    void srand (unsigned int seed)  (функция)
Эта функция устанавливает seed как начальное число для нового ряда псевдослучайных чисел.

Если Вы вызываете rand перед тем как начальное число было установлен srand, то она использует значение 1 как заданное по умолчанию начальное число.

Чтобы производить случайные числа (не только псевдослучайные), делайте srand(time(0)).

BSD Функции Случайного числа

Этот раздел описывает набор функций для порождения случайного числа, являющиеся дополнением к BSD.

Нет особого преимущества при использовании этих функций с библиотекой GNU C; мы поддерживаем их только для совместимости BSD.

Прототипы для этих функций находятся в " stdlib.h ".

    long int random ()  (функция)
Эта функция возвращает следующее псевдослучайное число. Диапазон возвращенных значений - от 0 до RAND_MAX.

    void srandom (unsigned int seed)  (функция)
Srandom функция устанавливает начальное число для random. Если Вы обеспечиваете значение начального числа 1, это заставит random воспроизводить набор случайных значений по умолчанию.

Чтобы производить действительно случайные числа (не только псевдослучайные), делайте srandom(time(0)).

    void * initstate (unsigned int seed, void *state, size_t size) (функция)
Эта функция используется, чтобы инициализировать состояние генератора случайного числа. Аргумент state это массив size байтов, используемый для хранения информации о состоянии. Размер должен быть по крайней мере 8 байтов, а оптимальные размеры - 8, 16, 32, 64, 128, и 256. Больший массив состояния, лучше.

Возвращаемое значение - предыдущее значение массива информации о состоянии. Вы можете использовать это значение позже как аргумент setstate, чтобы восстановить состояние.

     void *setstate (void *state)
Эта функция восстанавливает информацию о состоянии случайного числа. Аргумент должен быть результатом предыдущего обращения к initstate или setstate.

Возвращаемое значение - предыдущее значение массива информации о состоянии. Вы можете использовать это значение позже как аргумент setstate, чтобы восстановить состояние.


Next Previous Contents