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 (арг<=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 | |+----------------------------------------------------------------------+