MATHERR(3M) 
НАЗВАНИЕ 
matherr - функция обработки ошибок
 СИНТАКСИС
 
	#include <math.h>
	
	int matherr (x)
	struct exception *x;
 
ОПИСАНИЕ 
Функция matherr вызывается функциями из  математической
библиотеки при обнаружении ошибок.  Пользователи  могут
определить  собственные  процедуры  обработки   ошибок,
включая  в  свои  программы  функцию  с именем matherr.
Функция matherr должна иметь описанный  выше  вид.  При
возникновении ошибки указатель x на структуру exception
будет   передан   разработанной  пользователем  функции
matherr. Эта структура, определенная во включаемом фай-
ле <math.h>, имеет следующий вид:
 
	struct exception {
	  int type;
	  char *name;
	  double arg1, arg2, retval;
	};
Элемент type представляет собой целое число,  описываю-
щее тип случившейся ошибки, из следующего списка  конс-
тант (определенных во включаемом файле):
| DOMAIN   |    Выход за пределы области определения.
 | 
|---|
 | SING      |    Попадание аргумента в точку сингулярности.
 | 
|---|
 | OVERFLOW   |   Переполнение.
 | 
|---|
 | UNDERFLOW  |   Исчезновение порядка.
 | 
|---|
 | TLOSS     |    Полная потеря значащих цифр.
 | 
|---|
 | PLOSS     |    Частичная потеря значащих цифр.
 | 
|---|
  
Элемент  name указывает на цепочку символов, содержащую
имя функции, при обращении к которой произошла  ошибка.
Компоненты arg1 и arg2 содержат значения аргументов при
вызове функции. Полю retval присвоено значение, которое
будет  возвращено  функцией по умолчанию, то есть в том
случае, если пользовательская функция matherr не  прис-
воит ей иного значения.
Если пользовательская функция matherr возвращает  нену-
левое значение, то не  будет  выдаваться  сообщение  об
ошибке и не будет устанавливаться  значение  переменной
errno.
Если функция matherr пользователем не предоставлена, то
при возникновении ошибки по умолчанию будут  вызываться
процедуры, описанные вместе с соответствующими  матема-
тическими функциями. Сведения об этих  процедурах  об -
единены в таблице, приводимой далее.  В  каждом  случае
переменной  errno  присваивается  значение  EDOM   либо
ERANGE и выполнение программы продолжается.
ПРИМЕР
 
	#include <math.h>
	int
	matherr (x)
	register struct exception *x;
	{
	  switch (x->type) {
	  case DOMAIN:
	    /* Возврат значения sqrt(-arg1) вместо 0 */
	    if (!strcmp(x->name, "sqrt")) {
	      x->retval=sqrt(-x->arg1);
	      return(0); /* Выдать сообщ., устан. errno */
	    }
	  case SING:
	    /* Для остальных DOMAIN и SING ошибок:
	       выдать сообщение и прекратить выполнение */
	    fprintf(stderr,"обл.определения в %sn",x->name);
	    abort();
	  case PLOSS:
	    /* Выдать подробное сообщение об ошибке */
	    fprintf(stderr,"потеря знач.цифр в %s(%g)=%gn",
	             x->name,x->arg1,x->retval);
	    return(1); /* Больше никаких действий */
	  }
	  return(0); /* Остальные ошибки - по умолчанию */
	}
Подразумеваемые процедуры обработки ошибок  
  
|  Типы ошибок                     
 | 
|---|
 |  тип  |  DOMAIN  |  SING  | OVERFLOW  |  UNDERFLOW  |  TLOSS    
 | 
|---|
 | errno  |  EDOM  |  EDOM  |   ERANGE   |   ERANGE   |  ERANGE   
 | 
|---|
 | BESSEL:  |  -  |  -  |  -  |  -  |  M,0     
 |  |  y0,y1,yn (арг<=0) | M,-H | - | - | - | -
 |  | EXP:   |   -  |  -  |  H   |    0  |    -      
 |  | LOG, LOG10:                                                               
 |  |  (арг<0)  |    M,-H   |   -  |   -   |    -    |    -      
 |  | (арг=0)  |   -   |   M,-H   |   -   |   -    |   -      
 |  | POW:                                                                      
 |  |  (отр ** нецел)  |    -    |    -   |  +/-H   |   0    |   -      
 |  |  (0 ** неполож)  |    M,0  |   -   |  -    |    -   |    -      
 |  | SQRT:  |   M,0  |    -  |   -  |   -  |    -      
 |  | GAMMA: |  -  |  M,H  |   H  |    -   |     -      
 |  | HYPOT:  |   -  |   -  |  H  |   -  |    -      
 |  | SINH:  |   -  |  -  |   +/-H  |    -  |     -      
 |  | COSH:  |    -   |    -   |    H    |     -    |  -      
 |  | SIN, COS, TAN: |   -   |    -    |   -    |    -    |  M,0     
 |  | ASIN, ACOS, ATAN2:  |  M,0   |  -  |   -  |     - |    -      
 |                                                                              
 Сокращения: 
 
|   *   |    Значение возвращается со всеми неутерянными значащими цифрами   
 | 
|---|
 |   M   |    Выдается сообщение (ошибка EDOM)                                
 | 
|---|
 |   H    |   Возвращается HUGE                                               
 | 
|---|
 |   -H   |   Возвращается -HUGE                                              
 | 
|---|
 |  +/-H  |   Возвращается HUGE или -HUGE                                     
 | 
|---|
 |   0    |   Возвращается 0                                                  
 | 
|---|
  
 |