Справочник по функциям С++. Подпрограммы классификации Подпрограммы преобразования
Скачать 3.41 Mb.
|
_matherr----------------------------------------------------------------- Назначение Программа обработки ошибок в вычислениях с пла- вающей точкой. Синтаксис #include double _matherr(_mexcep why, char *fun, double *arg1p, double *arg2p, double retval); Прототип в math.h Замечания _matherr служит указателем на обработчик ошибок во всех программах математической библиотеки; она вызывает matherr и обрабатывает значение, возвращаемое matherr. _matherr никогда не вызы- вается из программ пользователей. Где бы в математической библиотеке ни возникла ошибка, вызывается программа _matherr с нес- колькими аргументами. _matherr делает 4 вещи: * использует аргументы для заполнения структуры exeption * вызывает matherr с указателем на структуру exeption, чтобы проверить, может ли matherr обработать ошибку * проверяет значение, возвращенное matherr сле- дующим образом: если matherr вернула 0 (что указывает на то, что она не может обработать ошибку), _matherr устанавливает errno (см.дальше) и печатает сообщение об ошибке если matherr вернула ненулевое значение (что указывает на то, что matherr может обработать ошибку), то _matherr не уста- навливает errno и не печатает сообщение об ошибке. * возвращает е->errval вызывающей программе. Следует отметить, что matherr может изменять e->retval для уточнения значения вызывающей программе. Когда _matherr устанавливает errno (основываясь на возвращенном 0), она помещает тип обнаружен- ной ошибки (из поля type структуры exeption) в errno: либо EDOM, либо ERANGE. Возвращаемое _matherr возвращает значение e->retval. Это значение значение первоначально равно входному параметру retval, переданному _matherr, и может быть мо- дифицировано matherr. Для результатов математических функций больших, чем MAXDOUBLE, retval по умолчанию равен макро- су HUGE_VAL того же знака, что и до обращения к matherr. Для результатов математических функций меньших, чем MINDOUBLE, retval устанавливается в 0 и передается _matherr. В обоих случаях, ес- ли matherr не изменяет e->errval, _matherr ус- танавливает errno в ERANGE - результат выходит за предел Смотри также matherr ----------------------------------------------------------------- matherr----------------------------------------------------------------- Назначение Программа обработки математических ошибок, модифицируемая пользователем. Синтаксис #include int matherr(struct exeption *e); Прототип в math.h Замечания mather вызывается функцией _mather для обработ- ки ошибок функций библиотеки math.h. По умолчанию в Турбо Си программа matherr прос- то возвращает 0. Она служит как заготовка, ко- торую можно заменить, написав свою программу обработки ошибок (см. приведенный ниже пример обработки ошибок, определенный пользователем). Вы можете изменить matherr до сложной программы обработки ошибок (как, например, распознавание и исправление некоторых типов ошибок); изменен- ная matherr должна возвращать 0, если она не смогла исправить ошибку, и - не ноль, если ошибка исправлена. Когда matherr возвращает не ноль, то сообщение об ошибке не печатается и errno не изменяется. Структура exeption, определенная в math.h, име- ет вид: struct exeption { + int type; char *name; double arg1,arg2,retval; }; Эти поля структуры следующие: ----------------------------------------------------------------- Поле Что оно представляет. ----------------------------------------------------------------- type тип обнаруженной математической ошибки; описан типом enum в typedef _mexcep (описание приведено ниже) name указатель на 0-оканчивающуюся строку, содержащую имя биб- лиотечной функции, в которой произошла ошибка arg1, аргументы (переданные функции, указанной в name), аrg2 которые вызвали ошибку; если функции был передан только один аргумент - он сохраняется в arg1 retval значение для matherr, возвращаемое по умолчанию; может быть изменено вами ----------------------------------------------------------------- typedef _mexcep, описанное в math.h, определяет следующие символические константы, соответству- ющие возможным математическим ошибкам: ----------------------------------------------------------------- Символьная константа Математическая ошибка ----------------------------------------------------------------- DOMAIN аргумент не входит в область определения функции, например: log(-1) SING аргументы дают бессмысленное значение функции, например: pow(0,-2) OVERFLOW аргумент дает результат функции больше, чем MAXDOUBLE, например: exp(1000) UNDERFLOW аргумент дает результат функции меньше, чем MINDOUBLE, например: exp(-1000) TLOSS аргумент дает результат функции с потерей всех значащих цифр, например: sin(10e70) ----------------------------------------------------------------- Символьные константы MAXDOUBLE и MINDOUBLE оп- ределены в values.h Отметим, что _matherr не может быть изменена. Функция matherr очень широко используется в библиотеках поддержки Си и поэтому рекомендует- ся ее использование для написания машинно-неза- висимых программ. Поведение по умолчанию функции matherr в стиле ОС UNIX (т.е. печать сообщений и завершение ра- бот) является несовместимым с ANSI-стандартом. Eсли вы предпочитаете версию matherr, как в UNIX, то используйте MATHERR.C, поставляемую на дистрибутивных дискетах Турбо Си. Возвращаемое По умолчанию matherr возвращает просто 1, значение если возникла ошибка UNDERFLOW или TLOOS - функция возвращает 0. matherr может также изме- нить e->retval, которая вернется в вызвавшую программу через _matherr. Когда matherr возвращает 0 (показывая, что нес- пособна обработать ошибку), _matherr устанавли- вает errno и печатает сообщение об ошибке (см. для большей информации _matherr). Когда matherr возвращает не 0 (что говорит о возможности исправления ошибки), errno не уста- навливается и сообщения не печатаются. Переносимость matherr переносима для многих компиляторов язы- ка Си. Функция matherr в стиле ситемы UNIX на- ходится в MATHERR.С на дистрибутивных дискетах Турбо Си. Смотри также _matherr Пример /* Приведена написанная пользователем функция matherr, обнаруживающая отрицательные аргу- менты, передаваемые в sgrt, и преобразующая их в положительные перед запуском sgrt.*/ #include #include int matherr (struct exception *a) { if ( a->type == DOMAIN ) { if (strcmp ( a->name, "sgrt" ) == 0) { a->retval = sgrt (- (a->arg1)); return(1); } } return (0); } ----------------------------------------------------------------- |