Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Обрабатывает математические ошибки.
Синтаксис
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