Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4157

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

  

 
 

Г Л А В А  

26 

 
 
 

Обработка ошибок  

<errno.h> 

В заголовочном файле errno.h определены макрокоманда 

errno

, а 

также  символические  константы 

EDOM

ERANGE

  и 

EILSEQ

,  которые 

используются  для  обработки  ошибок,  возникающих  при  работе 
стандартных функций. 
Определение макроса 

errno

 имеет следующий вид: 

  #define errno int_модифицируемое_L_value 

Этот макрос определяет модифицируемое L-value типа 

int

, в ко-

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

errno

  можно  рассматривать  как  внешнюю  глобальную 

переменную. 
После  завершения  исполнения  стандартной  функции  вызвавшая 
ее  функция  может  проверить  значение  переменной 

errno

,  чтобы 

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

errno

  нужно  записать  нулевое  значение.  Если  во 

время исполнения стандартной функции могут произойти ошиб-
ки, то для этой функции определены коды, которые она записы-
вает  в  переменную 

errno

.  Все  коды  ошибок,  устанавливаемые 

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

EDOM

  определяет  код  ошибки,  который  устанавливает 

стандартная функция, если значение параметра этой функции не 

  

 


background image

Глава 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; 


background image

  

 
 

Г Л А В А  

27 

 
 
 

Математические функции 

<math.h> 

Все математические функции, определенные в стандартной биб-
лиотеке,  имеют  параметры  и  возвращают  значение  типа 

double

Однако  заметим,  что  в  языке  программирования  C++  эти  функ-
ции также перегружены для типов 

float

 и 

long double

27.1. Обработка ошибок 

При  работе  математических  функций  могут  возникать  ошибки 
двух типов: 

 

значение параметра не входит в область определения матема-
тической функции; 

 

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

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

errno

  значение  макроса 

EDOM

  и  возвращает 

значение, которое зависит от реализации. 
Во  втором  случае  математическая  функция  устанавливает  в  пе-
ременную 

errno

  значение  макроса 

ERANGE

  и  возвращает  одно  из 

следующих значений: 

  

 


background image

Глава 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> 


background image

Часть 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); 


Смотрите также файлы