Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

matherr

matherr


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

Синтаксис          #include <math.h>
                   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;
         ¦ вы можете модифицировать это значение.
---------+-----------------------------------------------------------

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

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

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

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

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

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

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

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

Пример:

#include<math.h>
#include<stdio.h>
#include<string.h>

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;
}

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог