| Сервер поддерживается Центром Информационных Технологий (095) 932-9212, 932-9213, 939-0783 E-mail: info@citforum.ru

Сервер содержит море(!) аналитической информации | CIT Forum CD-ROM

### 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,"обл.определения в %s\n",x->name);
    	    abort();
    	  case PLOSS:
    	    /* Выдать подробное сообщение об ошибке */
    	    fprintf(stderr,"потеря знач.цифр в %s(%g)=%g\n",
    	             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

Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT