Учись программированию на C++ Builder бесплатно!

Функция


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

Синтаксис


#include <math.h>
int matherr(struct exception *e);

Прототип


math.h

Описание


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

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

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

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

Возвращаемое значение


По умолчанию функция 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;
}

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Поиск по сайту