Russian Belarusian English German Japanese Ukrainian

Matherr

CuBook05

Функция

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

#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

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