804_____________________________________________Глава 14

14.5.4 _matherr и _matherrl — обработчики ошибок

Синтаксис

ftinclude <math.h>
int matherr(struct exception *e);

int matherri(struct exception! *e) ;

Описание

Функция _matherr или _matherrl (для типов long double) вызываются биб
лиотечными математическими функциями при возникновении в них ошибок, свя
занных с недопустимыми значениями параметров (корень или логарифм отрицате-
льного числа и т.п.). Функции перехватывают только ошибки, выхода за пределы
области определения и выхода за диапазон допустимых значений, но не реагируют
на исключения при выполнении математических операций, например, при деле-
нии на 0. Для перехвата таких событий служит функция signal.

Стандартные варианты _matherr и _matherrl могут быть переопределены по-
льзователем, если он объявит в своем приложении аналогичные функции. Эти
функции пользователя должны возвращать ненулевое значение, если они обрабо-
тали ошибку. В этом случае не возникает стандартного сообщения об ошибке и не
изменяется значение переменной еггпо. Если переписанные пользователем вари-
анты _matherr и _matherrl не обработали данную ошибку, они должны вернуть 0.
Тогда будет проведена стандартная обработка ошибки.

В качестве параметра е в функции передаются структуры:

struct exception {

int   type;

char *name;

double argi, arg2, retval;

In-
struct exception! {

int   type;

char *name;

long double argi, arg2, retval;

};

Элемент структуры type определяет тип ошибки. Элемент name указывает на
строку, содержащую имя функции, в которой произошла ошибка. Элементы argi
и arg2 — это значения аргументов, приведшие к ошибкам (если функция имеет
один аргумент, то его значение помещается в argi). Элемент retval — возвращае-
мое по умолчанию значение функции. Пользователь может изменить это значение.

Тип ошибки, хранящийся в элементе type, может принимать одно из следую-
щих значений:

DOMAIN        аргумент выходит за пределы области определения; напри-
мер, log(-l)

SING           аргумент соответствует особой точке функции; например,
pow(0, -2)

OVERFLOW    аргумент приводит к значению функции, превышающему
DBLJMAX (или LDBLJMAX); например, ехр(ЮОО)

UNDERFLOW   аргумент приводит к значению функции, меньшему чем
DBLJMIN (или LDBL_MIN); например, ехр(-ЮОО)

TLOSS         аргумент приводит к значению функции с полной потерей
значащих разрядов; например, sin(10e70)