matherr

Функция            Процедура обработки ошибок операций с
                   плавающей точкой, модифицируемая
                   пользователем

Синтаксис          #include 
                   int matherr(struct exception *e);

Файл, содержащий   math.h
прототип

Описание  Функция matherr вызывается для обработки ошибок,
          генерируемых функциями из библиотеки математичес-
          ких функций.

          matherr служит в качестве пользовательской ловуш-
          ки, (функции определяемой пользователем) которую
          вы можете написать сами (смотрите пример).

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

          Вы можете модифицировать процедуру matherr специ-
          ально для вашего случая (то есть она будет отлав-
          ливать определенные типы ошибок); модифицирован-
          ная функция matherr должна возвращать 0, если она
          не может обработать данную ошибку, и 1, если
          ошибка успешно обработана. Если функция matherr
          возвращает ненулевое значение, сообщение об ошиб-
          ке не печатается, и переменная errno не изменяет-
          ся.

          Ниже приведена структура exception (определенная
          в файле math.h):

          struct exception {
          int type;
          char *Function;
          double arg1, arg2, retval;
          };

          Составные части структуры exception обозначают
          следующее:

---------T-------------------------------------------------¬
¦Имя     ¦               Что это                           ¦
+--------+-------------------------------------------------+
¦type    ¦ тип произошедшей математической ошибки; тип enum¦
¦        ¦ определен в typedef_mexcep (смотрите определение¦
¦        ¦ после данного списка).                          ¦
¦Function¦ указатель на символьную строку с нулевым        ¦
¦        ¦ окончанием, содержащую имя библиотечной         ¦
¦        ¦ математической функции, которая выдала ошибку.  ¦
¦arg1,   ¦ аргументы (переданные данной функции), которые  ¦
¦arg2    ¦ вызвали ошибку; если функции передается только  ¦
¦        ¦ один аргумент, он хранится в arg1.              ¦
¦retval  ¦ стандартное возвращаемое значение для функции   ¦
¦        ¦ matherr; вы можете модифицировать это значение. ¦
L--------+--------------------------------------------------

           Параметр typedef_mexcep, также определенный в
           файле math.h, перечисляет следующие символические
           константы, представляющие собой возможные матема-
           тические ошибки:

----------------T------------------------------------------¬
¦Символическая  ¦   Математическая ошибка                  ¦
¦константа      ¦                                          ¦
+---------------+------------------------------------------+
¦DOMAIN         ¦ аргумент не находится в области          ¦
¦               ¦ определения функции (например log(-1));  ¦
¦SING           ¦ аргументы дают ошибку в сингулярности    ¦
¦               ¦ (например pow(0,-2));                    ¦
¦OVERFLOW       ¦ аргумент приводит к результату, превыша- ¦
¦               ¦ ющему MAXDOUBLE (например exp(1000));    ¦
¦UNDERFLOW      ¦ аргумент приводит к результату, меньшему ¦
¦               ¦ MINDOUBLE (например exp(-1000));         ¦
¦TLOSS          ¦ аргументы дают результат с потерей значащ¦
¦               ¦ цифр например sin(10e70)).               ¦
L---------------+-------------------------------------------

           Символические константы MAXDOUBLE и MINDOUBLE оп-
           ределены в файле values.h.

           Исходный код для функции matherr, определенной по
           умолчанию находится на дистрибутивных дисках с
           системой Turbo C++.

           Стандарт UNIX функции matherr несовместим со
           стандартом ANSI C. Если вам требуется версия фун-
           кции matherr для системы UNIX, пользуйтесь прог-
           раммой matherr.c, поставляемой на дистрибутивных
           дискетах пакета Turbo C.

Возвращаемое  значение
          По умолчанию функция matherr возвращает 1 если
          ошибка UNDERFLOW или TLOSS, иначе  0. Функция
          matherr также может модифицировать параметр
          e->retval, который посредством функции matherr
          передается в вызывающую программу.

          Когда функция matherr возвращает 0, (означающий,
          что обработать ошибку она не может), функция
          _matherr устанавливает переменную errno и печатает
          сообщение об ошибке. Когда функция matherr возвра-
          щает ненулевое значение, (означающее,  что  ошибка
          успешно  обработана),  глобальная переменная errno
          не устанавливается и сообщение об ошибке не  выво-
          дится.

Переносимость
          matherr доступна на многих компиляторах Си, одна-
          ко она не поддерживается стандартом ANSI C.
          matherr в стиле системы UNIX (которая печатает
          сообшение и завершает выполнение программы) пос-
          тавляется вместе с пакетом Turbo C++ в файле
          MATHERR.C. matherr может не поддерживаться в
          дальнейших версиях Turbo C++.
Пример:

#include
#include
#include

int matherr(struct exception *a);
{
   if (a -> type == DOMAIN)
   {
      if(strcmp(a -> name, "sqrt") == 0)
      {
         a -> retval = sqrt (-(a -> arg1));
         return (1);
   }
}
return (0);
}

int main(void)
{
   double x,y;
   x = -2.0;
   y = sqrt(x);
   printf("Значение, скорректированное matherr: %lf\n",y);
   return 0;
}