Matherr обработка ошибки математической функции


_matherr, _matherrl

int _matherrl (struct _exceptionl *err)

Эта функция не определена стандар­том ANSI С.

Функция _matherr() позволяет создавать свои собственные процедуры обработки ошибок. Она должна работать следующим образом. Когда _matherr() может решить проблему, возвращается ненулевое значение, и никакого сообщения не выводится. Встроенная переменная errno также не изменяется. Однако, если функция _matherr() не может решить проблему, она возвращает нуль, выводится соответствующее сообщение об ошибке, и изменяется значение встроенной пе­ременной errno. По умолчанию Borland С++ содержит версию функции _matherr(), которая возвращает нуль.

Функция _matherr() вызывается с аргументом типа exception, который показан ниже:

Элемент type содержит тип происшедшей ошибки. Он может принимать одно из следующих зна­чений:

Символ Значение
DOMAIN Ошибка области определения
SING Сингулярный, неопределенный результат
OVERFLOW Ошибка переполнения
UNDERFLOW Ошибка потери значимости
TLOSS Общая потеря значащих цифр

Элемент name содержит указатель на строку, которая содержит название функции, в которой произошла ошибка. Элементы arg1 и arg2 содержат значения аргументов функции, вызвавшей ошибку. Если функция имеет только один аргумент, то он будет содержаться в arg1. Наконец, элемент retval содержит значение функции_matherr(), возвращаемое по умолчанию. Можно вер­нуть другое значение.

Для функций, работающих с типом long double, следует использовать вариант функции обра­ботки ошибок _matherrl(). Структура exceptionl является той же самой, что и exception, за исклю­чением элементов arg1, arg2 и retval, которые в этом случае имеют тип long double.

Обработка ошибок в математических функциях

Какова хорошая практика для обработки ошибок в математических функциях? Я создаю библиотеку (модуль) специализированных функций, и моя основная цель — облегчить отладку кода, вызывающего эти функции, — не создавать блестящую удобную систему обработки ошибок.

Ниже приведен простой пример в VBA, но я заинтересован в том, чтобы слышать и другие языки. Я не совсем уверен, где я должен возвращать сообщение об ошибке/статус/флаг. Как дополнительный аргумент?

или что-то вроде следующего. Функция возвращает логический флаг «success» (как в приведенном ниже примере, который возвращает False, если входные массивы не являются числовыми и т.д.), Или номер ошибки/сообщение какого-либо другого типа.

Однако я не слишком сумасшедший, так как он разрушает симпатичный и читаемый синтаксис вызова, т.е. больше не может говорить c = AddArrays(a,b) .

Я открыт для предложений!

Очевидно, что обработка ошибок в целом является большой темой, и то, что наилучшая практика сильно зависит от возможностей языка, с которым вы работаете, и того, как программа, которую вы кодируете, подходит для других подпрограмм. Поэтому я ограничу свой ответ на VBA (используемый в Excel) и подпрограммы типа библиотек того типа, который вы описываете.

Исключения против кодов ошибок в библиотечных программах

В этом случае я бы не использовал код возврата. VBA поддерживает форму обработки исключений, которая, хотя и не такая мощная, как более стандартная форма, найденная в С++/Java/. NET, довольно похожа. Поэтому рекомендации этих языков в целом применяются. Вы используете исключения для указания процедур вызова, которые вызванная подпрограмма не может выполнять эту работу по какой-либо причине. Вы обрабатываете исключения на самом низком уровне, где вы можете сделать что-то значимое в этом отказе.

Bjarne Stroustrup дает очень хорошее объяснение, почему исключения лучше, чем коды ошибок для такого рода ситуаций в этой книге. (Книга о С++, но принципы обработки исключений С++ и обработки ошибок VBA одинаковы.)

Вот хороший отрывок из Раздела 8.3:

Когда программа состоит из отдельных модулей, и особенно когда эти модули разработаны отдельно библиотеки, обработка ошибок должна быть разделены на две отдельные части: [1] Сообщение об ошибках, которые не могут быть разрешены локально [2] обработка ошибок, обнаруженных в других местах Автор библиотеки может обнаруживать ошибки времени выполнения, но не есть идея, что с ними делать. Пользователь библиотеки может знать, как справиться с такими ошибками, но не может обнаружить их — иначе они будут обрабатывается в коде пользователя, а не слева, чтобы найти библиотеку.

В разделах 14.1 и 14.9 также рассматриваются исключения и коды ошибок в контексте библиотеки. (Существует копия книги в Интернете по адресу archive.org.)

Вероятно, есть много больше об этом в stackoverflow. Я просто нашел это, например:

(Там могут быть ошибки, связанные с надлежащим управлением ресурсами, которые необходимо очистить при использовании исключений, но они действительно не применяются здесь.)

Исключения в VBA

Вот как создается исключение в VBA (хотя терминология VBA «вызывает ошибку» ):

Если эта процедура не поймает ошибку, VBA предоставит другие подпрограммы над ней в стеке вызовов шанс (см. следующее: Ошибка VBA «Bubble Up» ). Вот как вызывающий может сделать это:

Что означает «сделать что-то значимое», это зависит от контекста вашего приложения. В случае примера моего вышеперечисленного, он решает, что некоторые ошибки следует обрабатывать, возвращая значение ошибки, которое Excel может помещать в ячейку рабочего листа, в то время как другие требуют неприятного предупреждения. (Здесь, где случай VBA в Excel фактически не является плохим конкретным примером, поскольку многие приложения делают различие между внутренними и внешними процедурами и между исключениями, которые вы ожидаете иметь возможность обрабатывать, и условиями ошибки, которые вы просто хотите знать о но для которого у вас нет ответа.)

Не забывайте утверждения

Поскольку вы упомянули об отладке, также стоит отметить роль утверждений. Если вы ожидаете, что AddArrays будут вызваны только подпрограммами, которые фактически создали свои собственные массивы или иным образом проверены, они используют массивы, вы можете сделать это:

Фантастическая дискуссия о различии между утверждениями и исключениями здесь:

Я привел здесь пример:

Некоторые рекомендации VBA о процедурах обработки общих массивов

Наконец, как примечание VBA, существуют варианты VBA и массивы с множеством ошибок, которых следует избегать, когда вы пытаетесь написать общие библиотечные процедуры. Массивы могут иметь более одного измерения, их элементы могут быть объектами или другими массивами, их начальные и конечные индексы могут быть любыми и т.д. Вот пример (непроверенный и не пытающийся быть исчерпывающим), который учитывает некоторые из них:

Описание функций C (Си) / C++ — matherr

Описание функций C (Си) / C++ — matherr

#include
int matherr(x);
struct exception *x; информация о математических

Функция matherr обрабатывает ошибки, порожденные функциями
математической библиотеки. Математические функции вызывают
matherr, когда обнаружена ошибка. Пользователь может обеспечить
различные объявления (определения) для функции matherr, выполняю-
щие обработку специальных ошибок.
Если в математической процедуре возникла ошибка, matherr
вызывается с указателем на следующую структуру (объявленную в
) как аргумент.

struct exeption <
int type;
char *name;
double arg1, arg2, retval;
>;

Type определяет тип математической ошибки. Он может быть
одним из следующих значений, объявленных в

Значение Его смысл

DOMAIN Ошибка области (определения) аргумента.

SING Особенность аргумента.

OVERFLOW Ошибка диапазона (области) переполнения

UNDERFLOW Ошибка диапазона потери значимости.

TLOSS Общая потеря значимости.

PLOSS Частичная потеря значимости.

Элемент структуры name является указателем на строку, окан-
чивающуюся нулевым символом и содержащую имя функции, вызвавшей
ошибку. Элементы структуры arg1 и arg2 определяют значения, выз-
вавшие ошибку. (Если задан только один аргумент, он запоминается
в arg1). Для заданной ошибки по умолчанию возвращается значение
retval. Это значение можно изменить. По возвращаемому значению
можно определить, действительно или нет возникла ошибка. Если
matherr возвращает 0, высвечивается сообщение об ошибке и errno
устанавливается в приблизительное значение ошибки. Если matherr
возвращает ненулевое значение, сообщение об ошибке не высвечива-
ется и errno остается неизменной.

Функция matherr в случае ошибки возвращает 0 и ненулевое
значение, если действие верно и успешно выполнено.
См.также acos, asin, atan, atan2, bessel, ccabs, cosh, exp,
hypot, log, pow, sin, sinh, sqrt, tan.


#include
#include
/* вылавливает ошибки в вызовах процедур log и log10. Если
ошибка является результатом отрицательного аргумента (ошибка
DOMAIN), возвращается log или log10 для абсолютного значения ар-
гумента. Появляется сообщение об ошибке. Если ошибка является 0
аргументом или ошибка сгенерирована некоторой другой процедурой,
действие выбирается по умолчанию */
int matherr(x)
struct exception *x;
<
if (x->type==DOMAIN) <
if(strsmp(x->name,»log»)==0 <
x->retval=log(-(x->arg1));
return(1);
>
else if(strsmp(x->name,»log10″)==0) <
x->retval=log10(-(x->arg1));
return(1);
>
>
return(0);
/* используется действие по умолчанию */
>

Обработка ошибок в математических функциях

Что является хорошей практикой для обработки ошибок в математических функциях? Я создаю библиотеку (модуль) специализированных функций, и моя главная цель — облегчить отладку кода, вызывающего эти функции, а не сделать удобное средство обработки ошибок.

Ниже приведен простой пример в VBA, но мне интересно слушать также и другие языки. Я не совсем уверен, где я должен возвращать сообщение об ошибке / статус / флаг. В качестве дополнительного аргумента?

или что-то вроде следующего. Функция возвращает логический флаг «success» (как в примере ниже, который возвращает False, если входные массивы не были числовыми и т. Д.) Или номер / сообщение об ошибке какого-либо другого типа.

Однако я не слишком в восторге от этого, так как он разрушает приятный и читаемый синтаксис вызова, то есть больше не может сказать c = AddArrays(a,b) .

Я открыт для предложений!

3 ответа

Очевидно, что обработка ошибок в целом является большой темой, и то, что лучше всего делать, во многом зависит от возможностей языка, с которым вы работаете, и от того, как подпрограмма, которую вы кодируете, вписывается в другие подпрограммы. Поэтому я ограничу свой ответ VBA (используется в Excel) и процедурами библиотечного типа того типа, который вы описываете.

Исключения и коды ошибок в подпрограммах библиотеки

В этом случае я бы не использовал код возврата. VBA поддерживает форму обработки исключений, которая, хотя и не такая мощная, как более стандартная форма в C ++ / Java / . NET, довольно похожа. Так что совет от этих языков в целом применим. Вы используете исключения, чтобы сообщить вызывающим подпрограммам, что вызываемая подпрограмма не может выполнять свою работу по какой-либо причине. Вы обрабатываете исключения на самом низком уровне, где вы можете сделать что-то значимое в этом сбое.

Бьярн Страуструп дает очень хорошее объяснение того, почему исключения лучше, чем коды ошибок для такой ситуации в этой книге. (Книга посвящена C ++, но принципы обработки исключений C ++ и обработки ошибок VBA одинаковы.)

Вот хорошая выдержка из Раздела 8.3:

Когда программа состоит из отдельных модулей, и особенно когда эти модули поступают из отдельно разработанных библиотек, обработку ошибок необходимо разделить на две отдельные части: [1] Отчет об условиях ошибок, которые не могут быть разрешены локально [2] Обработка ошибки, обнаруженные в других местах. Автор библиотеки может обнаруживать ошибки времени выполнения, но, как правило, не имеет представления, что с ними делать. Пользователь библиотеки может знать, как справиться с такими ошибками, но не может их обнаружить — иначе они будут обработаны в коде пользователя и не будут оставлены для поиска библиотекой.

В разделах 14.1 и 14.9 также рассматриваются исключения и коды ошибок в контексте библиотеки. (Копия книги онлайн на сайте archive.org.)

Вероятно, об этом много говорится о stackoverflow. Я только что нашел это, например:

(Могут быть подводные камни, связанные с правильным управлением ресурсами, которые должны быть очищены при использовании исключений, но они на самом деле здесь не применяются.)

Исключения в VBA

Вот как выглядит возникновение исключения в VBA (хотя терминология VBA означает «возникновение ошибки»):

Если эта подпрограмма не перехватит ошибку, VBA предоставит другим подпрограммам над ней в стеке вызовов возможность (см. Следующее : Ошибка VBA «Bubble Up» ). Вот как звонящий может сделать это:

Что означает «сделать что-то значимое», зависит от контекста вашего приложения. В случае моего примера вызывающего абонента выше, он решает, что некоторые ошибки должны быть обработаны, возвращая значение ошибки, которое Excel может поместить в ячейку рабочего листа, в то время как другие требуют неприятного предупреждения. (Вот где VBA в Excel на самом деле не является плохим конкретным примером, потому что многие приложения делают различие между внутренней и внешней подпрограммами, а также между исключениями, которые, как вы ожидаете, сможете обработать, и условиями ошибок, о которых вы просто хотите знать но на что у вас нет ответа.)

Илон Маск рекомендует:  RunError - Процедура Delphi

Не забывайте утверждения

Поскольку вы упомянули отладку, также стоит отметить роль утверждений. Если вы ожидаете, что AddArrays когда-либо будут вызываться только подпрограммами, которые фактически создали свои собственные массивы или иным образом подтвердили, что они используют массивы, вы можете сделать это:

Фантастическое обсуждение различий между утверждениями и исключениями здесь:

Я привел пример здесь:

Некоторые советы VBA по поводу общих процедур обработки массивов

Наконец, как примечание для VBA, существуют варианты VBA, и массивы поставляются с рядом ловушек, которых следует избегать при попытке написать общие подпрограммы библиотеки. Массивы могут иметь более одного измерения, их элементы могут быть объектами или другими массивами, их начальный и конечный индексы могут быть чем угодно и т. Д. Вот пример (не проверенный и не пытающийся быть исчерпывающим), который объясняет некоторые из них:

Стандартные библиотечные функции С++ (стр. 3 из 4)

Обрaботкa ошибок может быть модифицировaнa при изменении процедуры matherr.

double pi = 3.1415926535,x,y;

y = sin(x); /* y равен 1.0 */

y = sinh(x); /* y равен 2.3 */

double x; неотрицательное значение с плавающей точкой

Описание: Функция sqrt вычисляет квадратный корень x.

Возвращаемое значение : Функция sqrt возвращает результат вычисления квадратного корня. Если x — отрицательное, функция печатает сообщение об ошибке DOMAIN в stderr, устанавливает errno в EDOM и возвращает 0.

Обрaботкa ошибок может быть модифицировaнa при изменении процедуры matherr.

double tan(x); вычисляет тангенс x

double tanh(x); вычисляет гиперболический тангенс x

double x; радиан

Описание : Функции tan и tanh вычисляют соответственно тангенс и гиперболический тангенс x.

Возвращаемое значение: Функция tan возвращает тангенс x. Если x большой, при вычислениях может возникнуть частичная потеря значимости. В этом случае tan вырабатывает ошибку PLOSS, но сообщения не печатает. Если x настолько большой, что общая значимость результата теряется, тогда tan печатает сообщение об ошибке TLOSS в stderr и возв ращает 0. В обоих случаях errno устанавливается в ERANGE. Функция tanh возвращает гиперболический тангенс x.

Возвращаемого значения в случае ошибки нет.

x = tan(pi/4.0); /* x равен 1.0 */

y = tanh(x); /* y равен 1.6 */

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

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

Ошибка Описание
DOMAIN Аргумент для функции находится вне области определения функции. (например log(-1));
OVERFLOW Результат очень большой для предоставления его в возвращаемом значении. (например exp(1000));
PLOSS Возникла частичная потеря значимости.
SING Особенность аргумента: аргумент для функции имеет неверное значение(например, пересылается значения 0 к той функции, которая требует ненулевого значения). (например pow(0,-2));
TLOSS Возникла общая потеря значимости. (например sin(10e70))
UNDERFLOW Результат очень маленький для предоставления его в возвращаемом значении. (например exp(-1000));
Имя Что это
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#includeint matherr(struct exception *a); type == DOMAIN) name, «sqrt») == 0) < a ->retval = sqrt (-(a -> arg1)); return (1);>>return (0);>int main(vo ,y);return 0;>

4.1 Постановка задачи

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

Данная программа в дальнейшем может быть использована студентами для изучения математической библиотеки на лабораторных занятиях по изучению теоретического материала и приобретения практических навыков по дисциплине «Системное Программное Обеспечение», а также программа может быть использована в работе с операционной системой MS DOS.

4.2 Описание разработанной программы

Моя программа предназначена для демонстрации работы созданной мной библиотеки.

В программе организовано псевдографическое меню, в котором можно выбрать один из нескольких пунктов:

1) Площадь круга.

2) Объём цилиндра.

3) Площадь цилиндра.

4) Площадь трапеции.

5) Объём пирамиды.

7) Площадь сферы.

При выборе соответствующего пункта, необходимо нажать клавишу Enter, для того чтобы приступить к расчётам или, если выбран пункт «Выход», выйти из программы. Для немедленного выхода из программы необходимо нажать клавишу ESC.

В программе я использую встроенные библиотеки С++.

Название библиотеки Описание функции
Iostream.h Потоки ввода \ вывода
Conio.h Прототип функции задержки
Math.h Использование математических функций

А также помимо стандартных библиотек, подгружается matfac.cpp — разработанная мной библиотека.

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

В моей программе я использую несколько своих функций вызываемых из основной программы.

· f1-f8 — функции соответствующие описанным выше пунктам меню (Площадь круга, Объём цилиндра, …,Выход.).

· sw – функция для вызова других функций (f1-f8).

· mn – функция для организации меню.

В функции sw и mn в качестве аргументов передаются переменная соответствующая выбранному пункту меню, а также массив строк.

Непосредственно из функций f1-f8 передаются аргументы и вызываются описанные мною функции из matfac.cpp.

С помощью директив #include в головную программу выключаются другие файлы: matfac.cpp. Предположим что все они находятся в корневой директории диска С:. Если это не так, то необходимо изменить соответствующие директивы #include.

Листинги исполняемой программы kurs.cpp и подгружаемого модуля matfac.cpp представлены в приложениях 1 и 2.

5. Заключение

В данной курсовой работе мной был рассмотрен стандартный модуль для работы с математическими функциями на языке C++ “math.h”. А также разработан собственный модуль для вычисления площади, объёмов геометрических фигур и других параметров. Данная работа позволила мне более углубленно изучить работу с математическими функциями, различные тонкости языка. В курсовой работе была создана и описана программа, позволяющая вычислять некоторые геометрические величины.

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

Математическая обработка экспериментальных данных

Математические методы представляют совокуп­ность алгоритмов, основанных на теоретических поло­жениях и идеях определенного раздела математики и позволяющих осуществить комплексный анализ тех или иных закономерностей и отношений. Применение математических методов в инженерной психологии развивается, как уже отмечалось, по трем основным направлениям:

■ математическая обработка экспериментальных данных;

■ математическое моделирование деятельности оператора;

■ вычисление количественных значений инженерно-пси­хологических показателей.

Во многих случаях основным способом вычисле­ния последних является обработка экспериментальных данных или моделирование, поэтому это направление в данном разделе специально не рассматривается. Способы вычисления этих показателей рассматрива­ются при изучении соответствующих вопросов. При­менение математических методов связано с прогрес­сом вычислительной техники, применением ЭВМ в инженерно-психологических исследованиях. Эта связь наиболее ярко проявляется при автоматизации обра­ботки результатов эксперимента, применении имита­ционных моделей деятельности оператора, производ­стве различного рода вычислений.

Основными задачами математической обработки экспериментальных данных являются: определение характеристик случайных величин и событий, сравне­ние между собой их вычисленных значений, построе­ние законов распределения случайных величин, уста­новление зависимости между полученными случайными величинами, анализ случайных процессов. Эти вопро­сы подробно излагаются в специальной литературе [112, 128, 177]. Здесь же представляется целесообразным рас­смотреть лишь особенности и возможности применения их при решении инженерно-психологических задач.

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

где хi — наблюденное значение случайной величины,

n — объем выборки (число наблюдений).

Квадратный корень из дисперсии, т. е. величина, , носит название среднеквадратического отклонения и имеет ту же размерность, что и сама случайная величина. Для оценки вероятности случайного события используют величину , где m — число опытов, в которых данное событие имело место. Чем больше n, тем ближе вычисленные значения , Dx, P к своим истинным значениям, характеризующим генеральную совокупность изучаемой случайной величины.

Сравнение между собой одноименных характери­стик нескольких выборок проводится потому, что в силу ограниченного объема выборки полученные различия между характеристиками случайных величин (матема­тическими ожиданиями, дисперсиями и др.) может быть случайным и не всегда означает, что эти величины различны на самом деле. Проверку этого факта, т. е. проверку статистических гипотез, нужно проводить с помощью непараметрических и параметрических кри­териев согласия.

В первом случае используются не сами значения наблюдаемых величин, а только их упорядоченность (для каждой пары сравниваемых величин известно, какая из них больше), т. е. критерии, не зависящие от параметров распределения. Такие критерии весьма удобны для практического использования, так как тре­буют минимального объема вычислений и априорных сведений и могут использоваться даже при невозмож­ности прямых измерений изучаемых признаков. Такие случаи встречаются, например, при проверке степени различия индивидуальных качеств двух групп опера­торов в случае, если эти качества не могут быть коли­чественно определены. Основными из непараметри­ческих критериев согласия являются критерий знаков, критерий Смирнова и критерий Вилконсона.

При использовании параметрических критериев вычисляются значения параметров сравниваемых рас­пределений. Это усложняет процедуру сравнения, од­нако позволяет получить более точные результаты. Основными из параметрических критериев являются критерий Фишера, критерий Стьюдента и критерий x 2 . Критерий Фишера используется для проверки стати­стических гипотез о равенстве дисперсий двух выбо­рок. Он применяется в тех прикладных задачах, где необходимо исследовать стабильность изучаемых ве­личин. Например, он может быть использован для сравнения рассеяний ошибок двух операторов, разбро­сов оценок экспертов, полученных по разным методи­кам, однородности латентных периодов времени реак­ции в различных экспериментах и т. п. Критерий Стьюдента применяется для проверки значимости различия между двумя средними значениями, крите­рий x 2 служит для сравнения двух распределений, для проверки согласия эмпирического распределения с одним из теоретических.

Одним из способов проверки статистических ги­потез является последовательный анализ. Он приме­няется в том случае, когда число наблюдений в ис­следовании не устанавливается заранее, а является случайной величиной. Особенность последовательно­го анализа состоит в том, что после осуществления каж­дого наблюдения принимается одно из следующих решений: принять проверяемую гипотезу, отвергнуть ее, продолжать испытания. Прикладные задачи иссле­дования, в которых применяется последовательный анализ, могут быть теми же, что и в случае проверки гипотез по выборкам заданной длины, но при этом возможна существенная экономия в длительности эк­сперимента. В инженерной психологии последователь­ный анализ широко используется, например, при оцен­ке результатов деятельности оператора. С его помощью определяется то число опытов (решаемых оператором учебных задач), по выполнении которых оператору с заданной достоверностью выставляется оценка «зачет» или «незачет».

Илон Маск рекомендует:  Начинаем работать с ajax

Процедура последовательного анализа сводится к следующему. На каждом шаге испытаний после каж­дого опыта фиксируется число dn благоприятных исхо­дов среди проведенных п наблюдений. По известным формулам [15], зная заданные вероятности ошибок первого и второго рода, определяются значения оце­ночных границ аn и rn. В системе координат (dn, n) стро­ятся две параллельные прямые гп (п) и ап (п), имеющие одинаковый угловой коэффициент (рис. 8.1). Точки (dn, n) наносятся на график по ходу контроля, и эксперимент проводится до тех пор, пока очередная точка не вый­дет за пределы полосы, заключенной между прямыми ап и гп. Если dnn, то оператор получает «незачет», если

Рис. 8.1. Схема проведения последовательного анализа

dn>rn— «зачет». В случае, если an 2 или Колмо­горова. При этом следует иметь в виду, что одно и то же опытное распределение может дать положительный результат при сравнении не с одним, а с несколькими теоретическими распределениями. Такое обстоятель­ство имеет место, например, при изучении времени реакции оператора [182]. В таких случаях следует опи­раться не только на результаты формальной проверки с помощью критериев согласия, а изучать прежде все­го психологическую сущность и условия применимос­ти того или иного закона распределения.

Для определения связи между двумя и более пере­менными используются такие методы статистического анализа, как корреляционный, регрессионный, диспер­сионный, факторный и др. Корреляционный анализ служит для установления вида, знака и тесноты связи между двумя или несколькими случайными переменны­ми. В первом случае используют коэффициент парной корреляции, во втором — коэффициент множественной корреляции. Примером использования корреляционно­го анализа в инженерной психологии является, в част­ности, проверка прогностической валидности психоди- агностических тестов. Мерой валидности является в этом случае коэффициент корреляции оценок испы­туемых по психофизиологическим методикам с оцен­ками их профессиональной деятельности (т. е. с вне­шним критерием). Однако всегда следует помнить, что при интерпретации результатов корреляционного анализа необходима особая осторожность при учете статистически достоверных высоких корреляций: иногда могут возникнуть ложные корреляции за счет того, что обе изучаемые переменные испытывают сильное влияние третьего, не учтенного при наблю­дении фактора.

Для более углубленного изучения сопряженности количественных показателей в исследуемой совокуп­ности объектов служит регрессионный анализ. Регрес­сия (от лат. regressio — движение назад), выражаемая либо графически, либо аналитически, показывает как в среднем изменяется изучаемый показатель при из­менениях какого-то фактора (факториального показа­теля). Так же как и корреляция, регрессия может быть парной, либо множественной. В общем случае проце­дура регрессивного анализа (на примере парной рег­рессии) сводится к следующему. Пусть есть основания полагать, что изучаемые случайные величины х и у связаны некоторым соотношением. Тогда задача его описания распадается на установление общего вида зависимости и вычисление оценок его параметров. Стандартных методов выбора общего вида кривой не существует: здесь необходимо сочетать визуальный анализ корреляционного поля с качественным анали­зом природы переменных. Методы оценки параметров наиболее хорошо разработаны для линейных зависи­мостей, основным из них является метод наименьших квадратов. В общем виде уравнение множественной линейной регрессии имеет вид


где а и аi — неизвестные коэффициенты, определяе­мые методом наименьших квадратов; xi — исследуемые психологические показатели; n — число учитываемых показателей.

При п = 1 выражение (8.2) превращается в уравне­ние парной регрессии. Выражения типа (8.2) называ­ются также регрессионными моделями. В заключение отметим, что регрессия показывает лишь как изменя­ется изучаемый показатель в зависимости от измене­ния факторных показателей, но она ни в коем случае не показывает причинно-следственных связей между показателями.

При изучении трудовой деятельности часто при­ходится оценивать достоверность и степень влияния какого-либо фактора (или факторов) на изменение ве­личины некоторого показателя деятельности человека по сравнению со случайными причинами (например, случайным изменением значений изучаемого показа­теля от опыта к опыту). Эффективным методом реше­ния подобных задач является дисперсионный анализ. В зависимости от числа факторов, влияние которых исследуется, дисперсионный анализ подразделяется на одно-, двух-, трех- и т. д. факторный. При проведении дисперсионного анализа вся совокупность эксперимен­тальных данных разбивается на группы по градациям факторов. Градации могут различаться либо качествен­но, либо количественно по степени действия фактора. Так, при изучении влияния космического полета на психофизиологические показатели космонавта в дис­персионный комплекс были включены такие факторы, как условия работы космонавта с двумя градациями (полетные условия, земные условия); индивидуальность космонавта, каждую градацию которой представлял конкретный человек [137]. Значимость влияния факто­ра оценивается с помощью критерия согласия Фише­ра, представляющего в данном случае отношение факториальной (межгрупповой) дисперсии к случайной (внутригрупповой). Если различие между этими дис­персиями оказывается значимым, то и действие фак­тора на исследуемый показатель деятельности челове­ка оказывает существенное влияние.

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

Многие из изучаемых в инженерной психологии процессов носят вероятностный характер и поэтому описываются случайными функциями. Примером их является большинство электрофизиологических пока­зателей, рассмотренных в главе VII: ЭЭГ, ЭКГ, ЭМГ, ЭОГ и др. Математическая обработка эксперименталь­ных данных заключается в этом случае в вычислении основных характеристик данной случайной функции по ее отдельным реализациям, зарегистрированным в ходе эксперимента. Важной задачей при этом является установление таких свойств случайного процесса, как стационарность (постоянство основных характеристик во времени) и эргодичность (совпадение математичес­ких ожиданий и других характеристик для всех имею­щихся реализаций данной случайной функции). Для анализа стационарных процессов применяется спект­ральный анализ. Свойство эргодичности позволяет выявить все характеристики данной случайной функ­ции по одной достаточно длинной реализации, в то время как характеристики не эргодических процессов возможно определить лишь при достаточно большом числе реализаций.

В инженерной психологии, как правило, экспери­ментальному изучению подвергается не вся генераль­ная совокупность, а только часть ее — выборка; т. е. группа испытуемых, представляющих определенную популяцию и отобранных для эксперимента или на­блюдения. На основании полученных характеристик выборки делаются выводы о генеральной совокупно­сти. Практически любое статистическое исследование в инженерной психологии основано на анализе свойств и характеристик определенной выборки. Ее объем определяется двумя противоречивыми услови­ями. С одной стороны, она должна быть достаточно большой, чтобы правильно отразить все свойства ге­неральной совокупности. С другой стороны, она не должна быть чрезмерно большой, чтобы была реаль­ная возможность ее изучения. Поэтому результаты математической обработки экспериментальных дан­ных для выборки (вследствие случайного отбора в нее объектов из генеральной совокупности) могут отли­чаться от соответствующих характеристик генераль­ной совокупности. В связи с этим необходимо оценить достоверность полученных результатов, т. е. возмож­ность их распределения на всю генеральную совокуп­ность.

Для оценки достоверности пользуются принципом практической уверенности. Он состоит в том, что до­стоверным считают событие, имеющее достаточно большую, близкую к единице, вероятность. Такая ве­роятность называется доверительной. Величина, до­полняющая ее до единицы, называется уровнем зна­чимости. Он представляет собой вероятность того, что заключение, принятое достоверным, на самом деле окажется ошибочным. Общепринятыми считаются три уровня значимости: 0,05 —- для обычных исследо­ваний, 0,01 — для важных исследований, 0,001 — для особо важных исследований (например, связанных с отсутствием вредности какого-либо воздействия на человека). Соответствующие этим уровням значимо­сти доверительные вероятности соответственно рав­ны: 0,95; 0,99; 0,999. При построении законов распре­деления случайных величин вычисляется также для заданной доверительной вероятности диапазон воз­можных значений генеральной статистической ха­рактеристики. Этот диапазон называется доверитель­ным интервалом.

При отборе данных, характеризующих ту или иную выборку в инженерно-психологических исследованиях, следует учитывать в ряде случаев различные проявле­ния изменчивости характеристик оператора. Существу­ет по крайней мере два ее проявления. Во-первых, от индивидуума к индивидууму (индивидуальные разли­чия между операторами); во-вторых, для конкретного индивидуума — случайное изменение характеристик оператора от опыта к опыту. Одновременный учет обоих проявлений изменчивости может проводиться различными способами:

■ при формировании выборки для каждого из п испыту­емых берется по некоторому числу m реализаций слу­чайной величины, всего получается N = m-n значений;

■ с помощью жребия выбирается конкретный оператор и для него берется требуемое число значений изучаемой случайной величины;

■ выборка формируется по всем п операторам из сред­них значений изучаемой случайной величины, получен­ных на основании усреднения m значений этой величи­ны для каждого оператора, что эквивалентно, как и в первом случае, общему объему выборки, равному N=mn.

Однако в любом случае выборка обязательно дол­жна быть представительной, т. е. такой, чтобы элемент генеральной совокупности мог попасть в нее с задан­ной вероятностью, не зависящей от характеристик, подлежащих измерению. Такая выборка называется репрезентативной (от фр. representatif — представи­тельный).

Обработка ошибок в математических функций

Что такое хорошая практика для обработки ошибок в математических функций, связанных с? Я строй вверх библиотека (модуль) специализированных функций и моя главная цель состоит в том, чтобы сделать отладку проще кода, вызывающим эти функции — не сделать блестящий удобную обработку ошибок объекта.

Ниже приведен простой пример в VBA, но я заинтересован услышать от других языков. Я не совсем уверен, где я должен быть возвращающим сообщение об ошибке / статус / флаге. В качестве дополнительного аргумента?

или что-то вроде следующего. Функция возвращает логический «успех» флаг (как в приведенном ниже пример, который будет возвращать значение False, если входные массивы не были числовыми и т.д.), или номер / сообщение об ошибке какого-либо другого типа.

Однако я не слишком сумасшедшим об этом, так как это разрушает приятный и читаемый синтаксис вызова, то есть не может сказать c = AddArrays(a,b) больше.

Я открыт для предложений!

Очевидно обработки в целом ошибка большая тема, и то, что лучшие практики во многом зависит от возможностей языка вы работаете с и как рутиной вы кодирование припадков с использованием другими процедурами. Так что я буду сдерживать мой ответ на VBA (используется в Excel) и библиотека типа рутину сорта вы описываете.

Исключения против Коды ошибок в библиотечных подпрограммах

В этом случае, я бы не использовать код возврата. VBA поддерживает форму обработки исключений , которые, хотя и не столь мощным , как более стандартной формы найдены в C ++ / Java / . NET, очень похоже. Таким образом, совет от тех языков , как правило , применяется. Вы используете исключения сказать призывающие процедуры, вызываемая процедура не может сделать его работа по какой — либо причине. Вы обрабатывать исключения на самом низком уровне , где вы можете сделать что — то значимое об этом failue.

Бьерн Страуструп дает очень хорошее объяснение того, почему исключения лучше, чем коды ошибок для такого рода ситуации в этой книге. (Книга о C ++, но принципы, лежащие в C ++ обработка исключений и обработки ошибок VBA являются одинаковыми.)

Вот хороший отрывок из раздела 8.3:

Когда программа состоит из отдельных модулей, и особенно, если эти модули поставляются из отдельно разработанных библиотек, обработка ошибок должна быть разделена на две части: [1] Репортаж условий ошибок, которые не могут быть решены на местном уровне [2] Обработки ошибки, обнаруженные в другом месте автор библиотеки может обнаружить ошибки во время выполнения, но не в целом имеют ни малейшего представления, что делать о них. Пользователь библиотеки может знать, как справиться с такими ошибками, но не может их обнаружить — или иначе они будут обрабатываться в коде пользователя и не остался для библиотеки, чтобы найти.

Разделы 14.1 и 14.9 также адрес исключения vs. коды ошибок в контексте библиотеки. (Существует копия книги в Интернете по адресу archive.org.)

Существует, вероятно, много больше об этом на StackOverflow. Я только что нашел это, например:

(Там могут быть подводные камни, связанные с надлежащего управления ресурсами, которые должны быть очищены при использовании исключений, но они не очень применимы и здесь.)

Исключения в VBA

Вот как повышение исключение выглядит в VBA (хотя терминология VBA является «повышение ошибки»):

Если эта процедура не поймать ошибку, VBA даст другие процедуры над ним в вызове стека шанс (посмотреть: VBA Ошибка «Bubble Up» ). Вот как вызывающий абонент может сделать так:

Что «делать что — то значимое» означает , в зависимости от контекста приложения. В случае моего примера вызывающего абонента выше, он решает , что некоторые ошибки должны быть обработаны, возвращая значение ошибки, Excel можно поместить в ячейке рабочего листа, в то время как другие требуют неприятного сигнала. (Вот где случай VBA в Excel на самом деле не плохой конкретный пример, потому что много приложений делают различие между внутренними и внешними подпрограммами, а также между исключениями вы ожидаете , чтобы иметь возможность обрабатывать и условие ошибки , которые вы просто хотите знать о но для которых у вас нет ответа.)

Илон Маск рекомендует:  Что такое код fputchar

Не забудьте Assertions

Поскольку вы упомянули отладки, это также стоит отметить роль утверждений. Если вы ожидаете AddArrays только когда-либо вызываться подпрограммы, которые фактически создали свои собственные массивы или иным образом проверены они с использованием массивов, вы можете сделать это:

Фантастическое обсуждение разницы между утверждениями и исключениями здесь:

Я привел пример здесь:

Некоторые VBA Консультация О Общих процедурах обработки массивов

Наконец, в качестве VBA специфичной записки, существуют варианты VBA и массивы приходят с целым рядом ошибок, которых следует избегать, когда вы пытаетесь писать общие процедуры библиотеки. Массивы могут иметь более чем одно измерение, их элементы могут быть объекты или другие массивы, их начало и конец индексы могут быть все что угодно, и т.д. Вот пример (непроверенные и не пытается быть исчерпывающим), что составляет часть этого:

Справка по функциям С++ — файл n1.doc

Доступные файлы (1):

n1.doc 3490kb. 29.03.2006 00:36 скачать

n1.doc

matherr

модифицируемая пользователем.
Синтаксис #include

int matherr(struct exeption *e);
Прототип в math.h
Замечания mather вызывается функцией _mather для обработ-

ки ошибок функций библиотеки math.h.
По умолчанию в Турбо Си программа matherr прос-

то возвращает 0. Она служит как заготовка, ко-

торую можно заменить, написав свою программу

обработки ошибок (см. приведенный ниже пример

обработки ошибок, определенный пользователем).
Вы можете изменить matherr до сложной программы

обработки ошибок (как, например, распознавание


и исправление некоторых типов ошибок); изменен-

ная matherr должна возвращать 0, если она не

смогла исправить ошибку, и — не ноль, если

ошибка исправлена. Когда matherr возвращает не

ноль, то сообщение об ошибке не печатается и

errno не изменяется.
Структура exeption, определенная в math.h, име-

ет вид:
struct exeption <

Поле Что оно представляет.

type тип обнаруженной математической ошибки; описан типом enum

в typedef _mexcep (описание приведено ниже)
name указатель на 0-оканчивающуюся строку, содержащую имя биб-

лиотечной функции, в которой произошла ошибка
arg1, аргументы (переданные функции, указанной в name),

аrg2 которые вызвали ошибку; если функции был передан только

один аргумент — он сохраняется в arg1
retval значение для matherr, возвращаемое по умолчанию; может

быть изменено вами

следующие символические константы, соответству-

константа Математическая ошибка

например: log(-1)
SING аргументы дают бессмысленное значение функции,

например: pow(0,-2)
OVERFLOW аргумент дает результат функции больше, чем

MAXDOUBLE, например: exp(1000)
UNDERFLOW аргумент дает результат функции меньше, чем

MINDOUBLE, например: exp(-1000)
TLOSS аргумент дает результат функции с потерей всех

значащих цифр, например: sin(10e70)
——————————————————————
Символьные константы MAXDOUBLE и MINDOUBLE оп-

ределены в values.h
Отметим, что _matherr не может быть изменена.

Функция matherr очень широко используется в

библиотеках поддержки Си и поэтому рекомендует-

ся ее использование для написания машинно-неза-

висимых программ.
Поведение по умолчанию функции matherr в стиле

ОС UNIX (т.е. печать сообщений и завершение ра-

бот) является несовместимым с ANSI-стандартом.

Eсли вы предпочитаете версию matherr, как в

UNIX, то используйте MATHERR.C, поставляемую на

дистрибутивных дискетах Турбо Си.
Возвращаемое По умолчанию matherr возвращает просто 1,

значение если возникла ошибка UNDERFLOW или TLOOS —

функция возвращает 0. matherr может также изме-

нить e->retval, которая вернется в вызвавшую

программу через _matherr.
Когда matherr возвращает 0 (показывая, что нес-

пособна обработать ошибку), _matherr устанавли-

вает errno и печатает сообщение об ошибке (см.

для большей информации _matherr).
Когда matherr возвращает не 0 (что говорит о

возможности исправления ошибки), errno не уста-

навливается и сообщения не печатаются.
Переносимость matherr переносима для многих компиляторов язы-

ка Си. Функция matherr в стиле ситемы UNIX на-

ходится в MATHERR.С на дистрибутивных дискетах

Турбо Си.
Смотри также _matherr
Пример

/* Приведена написанная пользователем функция

matherr, обнаруживающая отрицательные аргу-

менты, передаваемые в sgrt, и преобразующая

их в положительные перед запуском sgrt.*/
#include

#include
int matherr (struct exception *a)

MATHERR


ОБЗОР

Компонуется при указании параметра -lm .

ОПИСАНИЕ

В System V Interface Definition (SVID) определено какие математическиефункции должны вызывать функцию matherr (), если обнаруживаетсяматематическое исключение. Эта функция вызывает до возврата из самойматематической функции; после возврата из matherr () система возвращаетсяв математическую функцию, которая, в свою очередь, возвращает управлениевызывающему.

Чтобы задействовать matherr (), программист должен определить макростестирования свойств _SVID_SOURCE (до включения каких-либо заголовочных файлов) и присвоить значение _SVID_ внешней переменной _LIB_VERSION .

Система предоставляет matherr () как версию по умолчанию. Эта версияничего не делает возвращает ноль (назначение этого смотрите далее). Версияпо умолчанию matherr () может быть перезаписана версией программиста,которая будет вызываться при возникновении исключений. Функция вызывается содним аргументом, указателем на структуру exception , определённуюследующим образом:

struct exception <
int type; /* тип исключения */
char *name; /* имя функции, вызвавшей исключение */
double arg1; /* 1-й аргумент функции */
double arg2; /* 2-й аргумент функции */
double retval; /* значение, возвращаемое функцией */>

В поле type может быть одно из следующих значений: DOMAIN Произошла ошибка области (аргумент функции вне диапазона, для которогоопределена функция). Возвращаемое значение зависит от функции; errno присваивается EDOM . SING Произошла ошибка особой точки (результат функции равенбесконечности). Возвращаемое значение, в большинстве случаев, равно HUGE (самое большое число с плавающей запятой одинарной точности) ссоответствующим знаком. В большинстве случаев, errno присваивается EDOM . OVERFLOW Возникло переполнение. В большинстве случаев, возвращается значение HUGE и errno присваивается ERANGE . UNDERFLOW Произошла потеря значимости. Возвращается 0.0 и errno присваивается ERANGE . TLOSS Полная потеря значимости. Возвращается 0.0 и errno присваивается ERANGE . PLOSS Частичная потеря значимости. Это значение не используется в glibc (и многихдругих системах).

Поля arg1 и arg2 это значения аргументов, переданных функции ( arg2 не определено для функций, у которых только один аргумент).

В поле retval указывается возвращаемое значение, которое математическаяфункция вернёт вызывающему. Написанная программистом matherr () можетизменить этого поле, чтобы вернуть другое значение из математическойфункции.

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

Если функция matherr () возвращает ненулевое значение, то система неизменяет errno и не печатает сообщение об ошибке.

Математические функции, которые используют matherr()

В столбцах «сообщение?» и «errno» описано поведение по умолчанию, если matherr () возвращает ноль. Если в «сообщение?» указано «y», то системавыводит сообщение об ошибке в стандартный поток ошибок.

В таблице используются следующие обозначения и сокращения:

функция тип результат Сообщение? errno
acos(|x|>1) DOMAIN HUGE y EDOM
asin(|x|>1) DOMAIN HUGE y EDOM
atan2(0,0) DOMAIN HUGE y EDOM
acosh(x 1) DOMAIN NAN y EDOM
atanh(|x|==1) SING (x>0.0)? y EDOM
HUGE_VAL :
-HUGE_VAL
cosh(fin) o/f OVERFLOW HUGE n ERANGE
sinh(fin) o/f OVERFLOW (x>0.0) ? n ERANGE
HUGE : -HUGE
sqrt(x X_TLOSS) TLOSS 0.0 y ERANGE
j1(|x|>X_TLOSS) TLOSS 0.0 y ERANGE
jn(|x|>X_TLOSS) TLOSS 0.0 y ERANGE
y0(x>X_TLOSS) TLOSS 0.0 y ERANGE
y1(x>X_TLOSS) TLOSS 0.0 y ERANGE
yn(x>X_TLOSS) TLOSS 0.0 y ERANGE
y0(0) DOMAIN -HUGE y EDOM
y0(x 0.0) ? n ERANGE
HUGE_VAL :
-HUGE_VAL
scalb() u/f UNDERFLOW copysign( n ERANGE
0.0,x)
fmod(x,0) DOMAIN x y EDOM
remainder(x,0) DOMAIN NAN y EDOM

АТРИБУТЫ


Описание терминов данного раздела смотрите в attributes (7).
Интерфейс Атрибут Значение
matherr () Безвредность в нитях MT-Safe

ПРИМЕР

Пример запуска, где в log (3) передаётся аргумент 0.0 и не используется matherr ():

$ ./a.out 0.0 errno: Числовой результат вне представимого диапазонаx=-inf

В следующем примере вызывается функция matherr () и возвращает 0:

$ ./a.out 0.0 0 исключение matherr SING в функции log()
арг: 0.000000, 0.000000
возвр.знач.: -340282346638528859811704183484516925440.000000log: SING errorerrno: Числовой аргумент вне области функцииx=-340282346638528859811704183484516925440.000000

Сообщение «log: SING error» выдаётся библиотекой Си.

В следующем примере вызывается функция matherr () и возвращается ненулевое значение:

$ ./a.out 0.0 1 исключение matherr SING в функции log()
арг: 0.000000, 0.000000
возвр.знач.: -340282346638528859811704183484516925440.000000x=-340282346638528859811704183484516925440.000000

В этом случае библиотека Си не печатает сообщение, и значение errno неизменяется.

В следующем примере вызывается функция matherr (), изменяется возвращаемоезначение математической функции и возвращается ненулевое значение:

$ ./a.out 0.0 1 12345.0 исключение matherr SING в функции log()
арг: 0.000000, 0.000000
возвр.знач.: -340282346638528859811704183484516925440.000000x=12345.000000

Исходный код программы

static int matherr_ret = 0; /* значение, которое должна
вернуть matherr() */static int change_retval = 0; /* должна ли matherr() изменять
возвращаемое функцией значение? */static double new_retval; /* новое значение, возвращаемое
функцией */

intmatherr(struct exception *exc) <
fprintf(stderr, «исключение matherr %s в функции %s()\n»,
(exc->type == DOMAIN) ? «DOMAIN» :
(exc->type == OVERFLOW) ? «OVERFLOW» :
(exc->type == UNDERFLOW) ? «UNDERFLOW» :
(exc->type == SING) ? «SING» :
(exc->type == TLOSS) ? «TLOSS» :
(exc->type == PLOSS) ? «PLOSS» : «. «,
exc->name);
fprintf(stderr, » арг: %f, %f\n»,
exc->arg1, exc->arg2);
fprintf(stderr, » возвр.знач.: %f\n», exc->retval);

if (change_retval)
exc->retval = new_retval;

intmain(int argc, char *argv[]) <
double x;

if (argc > 2) <
_LIB_VERSION = _SVID_;
matherr_ret = atoi(argv[2]);
>

if (argc > 3) <
change_retval = 1;
new_retval = atof(argv[3]);
>

x = log(atof(argv[1]));
if (errno != 0)
perror(«errno»);

printf(«x=%f\n», x);
exit(EXIT_SUCCESS);>

Справка по функциям С++ — файл n1.doc

Доступные файлы (1):

n1.doc 3490kb. 29.03.2006 00:36 скачать

n1.doc

matherr

модифицируемая пользователем.
Синтаксис #include

int matherr(struct exeption *e);
Прототип в math.h
Замечания mather вызывается функцией _mather для обработ-

ки ошибок функций библиотеки math.h.
По умолчанию в Турбо Си программа matherr прос-

то возвращает 0. Она служит как заготовка, ко-

торую можно заменить, написав свою программу

обработки ошибок (см. приведенный ниже пример

обработки ошибок, определенный пользователем).
Вы можете изменить matherr до сложной программы


обработки ошибок (как, например, распознавание

и исправление некоторых типов ошибок); изменен-

ная matherr должна возвращать 0, если она не

смогла исправить ошибку, и — не ноль, если

ошибка исправлена. Когда matherr возвращает не

ноль, то сообщение об ошибке не печатается и

errno не изменяется.
Структура exeption, определенная в math.h, име-

ет вид:
struct exeption <

Поле Что оно представляет.

type тип обнаруженной математической ошибки; описан типом enum

в typedef _mexcep (описание приведено ниже)
name указатель на 0-оканчивающуюся строку, содержащую имя биб-

лиотечной функции, в которой произошла ошибка
arg1, аргументы (переданные функции, указанной в name),

аrg2 которые вызвали ошибку; если функции был передан только

один аргумент — он сохраняется в arg1
retval значение для matherr, возвращаемое по умолчанию; может

быть изменено вами

следующие символические константы, соответству-

константа Математическая ошибка

например: log(-1)
SING аргументы дают бессмысленное значение функции,

например: pow(0,-2)
OVERFLOW аргумент дает результат функции больше, чем

MAXDOUBLE, например: exp(1000)
UNDERFLOW аргумент дает результат функции меньше, чем

MINDOUBLE, например: exp(-1000)
TLOSS аргумент дает результат функции с потерей всех

значащих цифр, например: sin(10e70)
——————————————————————
Символьные константы MAXDOUBLE и MINDOUBLE оп-

ределены в values.h
Отметим, что _matherr не может быть изменена.

Функция matherr очень широко используется в

библиотеках поддержки Си и поэтому рекомендует-

ся ее использование для написания машинно-неза-

висимых программ.
Поведение по умолчанию функции matherr в стиле

ОС UNIX (т.е. печать сообщений и завершение ра-

бот) является несовместимым с ANSI-стандартом.

Eсли вы предпочитаете версию matherr, как в

UNIX, то используйте MATHERR.C, поставляемую на

дистрибутивных дискетах Турбо Си.
Возвращаемое По умолчанию matherr возвращает просто 1,

значение если возникла ошибка UNDERFLOW или TLOOS —

функция возвращает 0. matherr может также изме-

нить e->retval, которая вернется в вызвавшую

программу через _matherr.
Когда matherr возвращает 0 (показывая, что нес-

пособна обработать ошибку), _matherr устанавли-

вает errno и печатает сообщение об ошибке (см.

для большей информации _matherr).
Когда matherr возвращает не 0 (что говорит о

возможности исправления ошибки), errno не уста-

навливается и сообщения не печатаются.
Переносимость matherr переносима для многих компиляторов язы-

ка Си. Функция matherr в стиле ситемы UNIX на-

ходится в MATHERR.С на дистрибутивных дискетах

Турбо Си.
Смотри также _matherr
Пример

/* Приведена написанная пользователем функция

matherr, обнаруживающая отрицательные аргу-

менты, передаваемые в sgrt, и преобразующая

их в положительные перед запуском sgrt.*/
#include

#include
int matherr (struct exception *a)

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL