MATHERR(3M) MATHERR(3M)
НАЗВАНИЕ
matherr - функция обработки ошибок
СИНТАКСИС
#include
int matherr (x)
struct exception *x;
ОПИСАНИЕ
Функция matherr вызывается функциями из математической
библиотеки при обнаружении ошибок. Пользователи могут
определить собственные процедуры обработки ошибок,
включая в свои программы функцию с именем matherr.
Функция matherr должна иметь описанный выше вид. При
возникновении ошибки указатель x на структуру exception
будет передан разработанной пользователем функции
matherr. Эта структура, определенная во включаемом фай-
ле , имеет следующий вид:
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
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 PLOSS
errno EDOM EDOM ERANGE ERANGE ERANGE ERANGE
BESSEL: M,0 *
y0,y1,yn M,-H
(arg<=0)
EXP: H 0
LOG,LOG10
(arg<0) M,-H
(arg=0) M,-H
POW: +/-H 0
отр^нецел M,0
0^неполож M,0
SQRT:
(arg<0) 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.
|