Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

_matherr и _matherrl - обработчики ошибок

CuBook05

Синтаксис

#include <math.h>
int _matherr(struct _exception *e);
int _matherrl(struct _exceptionl *e);
 
Описание

Функция _matherr или _matherrl (для типов long double) вызываются библиотечными математическими функциями при возникновении в них ошибок, связанных с недопустимыми значениями параметров (корень или логарифм отрицательного числа и т.п.). Функции перехватывают только ошибки, выхода за пределы области определения и выхода за диапазон допустимых значений, но не реагируют на исключения при выполнении математических операций, например, при делении на 0. Для перехвата таких событий служит функция signal.
 
Стандартные варианты _matherr и _matherrl могут быть переопределены пользователем, если он объявит в своем приложении аналогичные функции. Эти функции пользователя должны возвращать ненулевое значение, если они обработали ошибку. В этом случае не возникает стандартного сообщения об ошибке и не изменяется значение переменной errno. Если переписанные пользователем варианты _matherr и _matherrl не обработали данную ошибку, они должны вернуть 0. Тогда будет проведена стандартная обработка ошибки.
 
В качестве параметра e в функции передаются структуры:
struct _exception
{
int type;
char *name;
double argl, arg2, retval;
};
struct _exceptionl
{
int type;
char *name;
long double argl, arg2, retval;
};
Элемент структуры type определяет тип ошибки. Элемент name указывает на строку, содержащую имя функции, в которой произошла ошибка. Элементы argl и arg2 это значения аргументов, приведшие к ошибкам (если функция имеет один аргумент, то его значение помещается в argl). Элемент retval возвращаемое по умолчанию значение функции. Пользователь может изменить это значение.
 
Тип ошибки, хранящийся в элементе type, может принимать одно из следующих значений:
Значение Описание
DOMAIN аргумент выходит за пределы области определения; например, log(-l)
SING аргумент соответствует особой точке функции; например, pow(0, -2)
OVERFLOW аргумент приводит к значению функции, превышающему DBL_MAX (или LDBL_MAX); например, exp(1000)
UNDERFLOW аргумент приводит к значению функции, меньшему чем DBL_MIN (или LDBL_MIN); например, exp(1000)
TLOSS аргумент приводит к значению функции с полной потерей значащих разрядов; например, sin(10e70)
Фигурирующие в приведенном описании макросы DBL_MAX, DBL_MIN, LDBL_MAX и LDBL_MIN определены в файле float.h.
 
Пример

Приведенный ниже пример показывает функцию, обрабатывающую ошибку типа DOMAIN функции eqrt (корень из отрицательного числа), заменяя результат на корень из положительного числа:
int _matherr (struct _exception *a)
{
if(a->type == DOMAIN)
{
if(!strcmp(a->name, "sqrt"))
{
a->retval = sqrt(-(a->argl));
return 1;
}
}
return 0;
}
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий