3. Математические ошибки

 

Ошибки, приведенные ниже, порождаются математическими процедурами библиотеки Си. Эти ошибки соответствуют только тем типам ошибок, которые объявлены в <math.h>, и возвращаются функцией matherr.

Таблица 1.

 Ошибка  Описание
DOMAIN

Аргумент для функции находится вне области определения функции.

(например log(-1));

OVERFLOW

Результат очень большой для предоставления его в возвращаемом значении.

(например exp(1000));

PLOSS Возникла частичная потеря значимости.
SING

Особенность аргумента: аргумент для функции имеет неверное значение(например, пересылается значения 0 к той функции, которая требует ненулевого значения).

(например pow(0,-2));

TLOSS

Возникла общая потеря значимости.

(например sin(10e70))

UNDERFLOW

Результат очень маленький для предоставления его в возвращаемом значении.

(например exp(-1000));

 

Имя функции: matherr

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

 

Синтаксис #include

 int matherr(struct exception *e);

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

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

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

 

struct exception {

int type;

char *Function;

double arg1, arg2, retval;

};

 

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

 

Таблица 2.

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

 

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

Исходный код для функции 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;

}


Информация о работе «Стандартные библиотечные функции С++»
Раздел: Информатика, программирование
Количество знаков с пробелами: 33993
Количество таблиц: 3
Количество изображений: 0

Похожие работы

Скачать
28139
14
0

... gettextsettings(), settextstyle(), setusercharsize(). viewporttype – Используется для получения настроек области вывода функцией getviewsettings(). struct viewporttype { int left; int top; int right; int bottom; int clip; } 2. Реализация пользовательской библиотеки “mouse.h” В стандартной комплектации BorlandC2.0, BorlandC3.1 или любой версии компилятора C++ от любой другой ...

Скачать
668870
13
0

... программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями. Эти ошибки могут являться следствием случайного затирание памяти программой. Abnormal program termination Аварийное завершение программы Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце ...

Скачать
155480
0
0

... виден черный цвет на белом фоне, зеленый на белом. Размещение указателей должно быть очень четко продумано (44, с.421). 4. ХАРАКТЕРИСТИКА БИБЛИОТЕЧНОГО ДИЗАЙНА СИБАЙСКОГО ИНСТИТУТА БАШКИРСКОГО ГОСУДАРСТВЕННОГО УНИВЕРСИТЕТА   Интенсивно развивающийся научно-технический прогресс вызывает необходимость реформ в сфере высшего образования. Значительно выросли требования к результативности учебной ...

Скачать
44104
0
0

... найти ошибки и повысит мобильность прикладной программы. Мобильность на уровне исходных текстов Материал, рассмотренный нами в предыдущем разделе, относится к вопросам мобильного программирования в связи с использованием функций операционной среды. Однако, если говорить о переносимости программ между компьютерами с разной архитектурой, имея в виду использование языка Си (не слишком высокого ...

0 комментариев


Наверх