Man pages на русском

         

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

Содержание раздела