_matherr
Обрабатывает математические ошибки.
Синтаксис
int _matherr(struct _exception *except);
Параметры
except
Указатель на структуру, содержащую сведения об ошибке.
Возвращаемое значение
_matherr
возвращает значение 0, указывающее ошибку или ненулевое значение, указывающее на успешность:
- Если
_matherr
возвращает значение 0, отображается сообщение об ошибке иerrno
задано соответствующее значение ошибки. - Если
_matherr
возвращает ненулевое значение, сообщение об ошибке не отображается иerrno
остается неизменным.
Дополнительные сведения о кодах возврата см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Функция _matherr
обрабатывает ошибки, созданные функциями с плавающей запятой библиотеки математики. Эти функции вызываются _matherr
при обнаружении ошибки. Это взаимодействие не влияет на режим с плавающей запятой компилятора или слова элемента управления с плавающей запятой. Так как _matherr
это функция библиотеки, математические встроенные функции не вызывают его.
Для специальной обработки ошибок можно указать другое определение _matherr
. Если вы используете динамически связанную версию библиотеки времени выполнения C (CRT), можно заменить подпрограмму по умолчанию _matherr
в исполняемом файле клиента на определяемую пользователем версию. Однако не удается заменить подпрограмму по умолчанию _matherr
в клиенте DLL библиотеки CRT.
При возникновении ошибки в математической подпрограмме _matherr
вызывается с указателем на _exception
структуру типов (определенную в <math.h>
) в качестве аргумента. Структура _exception
содержит следующие элементы.
struct _exception
{
int type; // exception type - see below
char* name; // name of function where error occurred
double arg1; // first argument to function
double arg2; // second argument (if any) to function
double retval; // value to be returned by function
};
Элемент type
задает тип математической ошибки. Это одно из следующих значений, определенных в <math.h>
:
Макрос | Description |
---|---|
_DOMAIN |
Ошибка домена аргумента |
_SING |
Сингулярность аргументов |
_OVERFLOW |
Ошибка переполнения диапазона |
_PLOSS |
Частичное снижение важности |
_TLOSS |
Общая потеря значения |
_UNDERFLOW |
Результат слишком мал для представления. (Сейчас это условие не поддерживается.) |
Элемент name
структуры — это указатель на строку, завершающую значение NULL, содержащую имя функции, вызвавшей ошибку. Элементы arg1
структуры и arg2
укажите значения, вызвавшие ошибку. Если задан только один аргумент, он хранится в arg1
.
Возвращаемое значение по умолчанию для данной ошибки retval
. Если вы измените возвращаемое значение, оно должно определять, действительно ли произошла ошибка.
Требования
Маршрут | Обязательный заголовок |
---|---|
_matherr |
<math.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
/* crt_matherr.c
* Illustrates writing an error routine for math
* functions.
* The error handling function must be named _matherr
*/
#include <math.h>
#include <string.h>
#include <stdio.h>
int main()
{
/* Do several math operations that cause errors. The _matherr
* routine handles _DOMAIN errors, but lets the system handle
* other errors normally.
*/
printf( "log( -2.0 ) = %e\n", log( -2.0 ) );
printf( "log10( -5.0 ) = %e\n", log10( -5.0 ) );
printf( "log( 0.0 ) = %e\n", log( 0.0 ) );
}
/* Handle several math errors caused by passing a negative argument
* to log or log10 (_DOMAIN errors). When this happens, _matherr
* returns the natural or base-10 logarithm of the absolute value
* of the argument and suppresses the usual error message.
*/
int _matherr(struct _exception *except)
{
/* Handle _DOMAIN errors for log or log10. */
if (except->type == _DOMAIN)
{
if (strcmp(except->name, "log") == 0)
{
except->retval = log(-(except->arg1));
printf("Special: using absolute value: %s: _DOMAIN "
"error\n", except->name);
return 1;
}
else if (strcmp(except->name, "log10") == 0)
{
except->retval = log10(-(except->arg1));
printf("Special: using absolute value: %s: _DOMAIN "
"error\n", except->name);
return 1;
}
}
printf("Normal: ");
return 0; /* Else use the default actions */
}
Special: using absolute value: log: _DOMAIN error
log( -2.0 ) = 6.931472e-01
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-01
Normal: log( 0.0 ) = -inf