НАЗВАНИЕ
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 | Частичная потеря значащих цифр. |
ПРИМЕР
#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 |