ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4298
Скачиваний: 28
Г Л А В А
26
Обработка ошибок
<errno.h>
В заголовочном файле errno.h определены макрокоманда
errno
, а
также символические константы
EDOM
,
ERANGE
и
EILSEQ
, которые
используются для обработки ошибок, возникающих при работе
стандартных функций.
Определение макроса
errno
имеет следующий вид:
#define errno int_модифицируемое_L_value
Этот макрос определяет модифицируемое L-value типа
int
, в ко-
торое стандартная функция может записать код ошибки, возник-
шей во время ее исполнения. С точки зрения исполняемой про-
граммы
errno
можно рассматривать как внешнюю глобальную
переменную.
После завершения исполнения стандартной функции вызвавшая
ее функция может проверить значение переменной
errno
, чтобы
определить, произошла ли ошибка во время исполнения стан-
дартной функции. Для этого перед вызовом стандартной функции
в переменную
errno
нужно записать нулевое значение. Если во
время исполнения стандартной функции могут произойти ошиб-
ки, то для этой функции определены коды, которые она записы-
вает в переменную
errno
. Все коды ошибок, устанавливаемые
стандартными функциями, имеют положительное значение.
Макрос
EDOM
определяет код ошибки, который устанавливает
стандартная функция, если значение параметра этой функции не
Глава 26. Обработка ошибок <errno.h>
317
входит в область определения этой функции. Этот код ошибки
устанавливают в переменной
errno
некоторые математические
функции.
Макрос
ERANGE
определяет код ошибки, который устанавливает
стандартная функция, если результат вычисления этой функции
определен, но его значение выходит за диапазон типа возвращае-
мого функцией значения. Этот код ошибки устанавливают в пе-
ременной
errno
некоторые математические функции.
Макрос
EILSEQ
определяет код ошибки, который устанавливает
стандартная функция, если при обработке встретилась непра-
вильная последовательность длинных (multibyte) символов.
Кроме того, в зависимости от реализации могут быть определены
и другие коды ошибок, возникающих во время исполнения стан-
дартных функций.
В листинге 26.1 приведен пример обнаружения ошибки, возни-
кающей при исполнении математической функции
acos
.
Листинг 26.1. Обнаружение ошибки при исполнении
стандартной функции
#include <stdio.h>
#include <math.h>
#include <errno.h>
int main()
{
double y;
errno = 0;
y = acos(5.5); /* аргумент вне области определения acos */
if (errno == EDOM)
printf("Domain error\n"); /* печатает: Domain error */
else
printf("acos = %f\n", y);
return 0;
}
Г Л А В А
27
Математические функции
<math.h>
Все математические функции, определенные в стандартной биб-
лиотеке, имеют параметры и возвращают значение типа
double
.
Однако заметим, что в языке программирования C++ эти функ-
ции также перегружены для типов
float
и
long double
.
27.1. Обработка ошибок
При работе математических функций могут возникать ошибки
двух типов:
значение параметра не входит в область определения матема-
тической функции;
результат вычисления определен, но его величина выходит за
диапазон типа данных, значение которого возвращает матема-
тическая функция.
Математические функции обрабатывают эти ошибки следующим
образом.
В первом случае, если значение параметра не входит в область
определения математической функции, то эта функция устанав-
ливает в переменную
errno
значение макроса
EDOM
и возвращает
значение, которое зависит от реализации.
Во втором случае математическая функция устанавливает в пе-
ременную
errno
значение макроса
ERANGE
и возвращает одно из
следующих значений:
Глава 27. Математические функции <math.h>
319
HUGE_VAL
, если значение функции, возвращающей значение
типа
double
, существует и положительно, но слишком велико
для представления типом
double
;
0
, если значение функции, возвращающей значение типа
double
, существует, но слишком мало для представления ти-
пом
double
;
-HUGE_VAL
, если значение функции, возвращающей значение
типа
double
, существует и отрицательно, но слишком велико
по модулю для представления типом
double
.
Переменная
errno
, а также макросы
EDOM
и
ERANGE
определены в
заголовочном файле
errno.h
. Макрос
HUGE_VAL
определен в заго-
ловочном файле math.h.
Пример обработки ошибки, возникающей при вызове математи-
ческой функции, приведен в
гл. 26
.
27.2. Тригонометрические функции
В стандартной библиотеке определены тригонометрические
функции
acos
,
asin
,
atan
,
atan2
,
cos
,
sin
,
tan
, которые имеют сле-
дующие прототипы:
double acos(double x); /* возвращает arccos x */
double asin(double x); /* возвращает arcsin x */
double atan(double x); /* возвращает arctg x */
double atan2(double y, double x); /* возвращает arctg y/x */
double cos(double x); /* возвращает cos x */
double sin(double x); /* возвращает sin x */
double tan(double x); /* возвращает tg x */
Заметим, что тригонометрическая функция
atan2
возвращает
угол, который находится в интервале от - до .
В листинге 27.1 приведен пример вычисления значения sin x.
Листинг 27.1. Вычисление значения sin x
#include <stdio.h>
#include <math.h>
Часть III. Стандартная библиотека языка программирования C
320
int main()
{
double x;
/* Введите действительное число */
printf("Input a real number: ");
scanf("%lf", &x);
printf("sin x = %f\n", sin(x));
return 0;
}
27.3. Экспоненциальная
и логарифмическая функции
В стандартной библиотеке определена экспоненциальная функ-
ция
exp
, которая имеет следующий прототип:
double exp(double x); /* возвращает exp x */
Также в стандартной библиотеке определены логарифмические
функции
log
и
log10
, которые имеют следующие прототипы:
double log(double x); /* возвращает ln x */
double log10(x); /* возвращает десятичный log x */
В листинге 27.2 приведен пример вычисления значений функций
exp
и
log
.
Листинг 27.2. Вычисление exp x и ln x
#include <stdio.h>
#include <math.h>
int main()
{
double x, y;
/* Введите действительное число */
printf("Input a real number: ");
scanf("%lf", &x);
y = exp(x);
printf("exp x = %f\n", y);