_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

См. также

Поддержка математических и плавающих точек