_matherr

Manipula erros matemáticos.

Sintaxe

int _matherr(struct _exception *except);

Parâmetros

except
Ponteiro para a estrutura que contém informações de erro.

Retornar valor

_matherr retorna 0 para indicar um erro ou um valor diferente de zero para indicar êxito:

  • Se _matherr retornar 0, uma mensagem de erro poderá ser exibida e errno será definido como um valor de erro apropriado.
  • Se _matherr retornar um valor diferente de zero, nenhuma mensagem de erro será exibida e errno permanecerá inalterada.

Para obter mais informações sobre códigos de retorno, confira errno, _doserrno, _sys_errlist e _sys_nerr.

Comentários

A função _matherr processa erros gerados pelas funções de ponto flutuante da biblioteca de matemática. Essas funções chamam _matherr quando um erro é detectado. Essa interação não é afetada pelo modo de ponto flutuante do compilador ou pela palavra de controle de ponto flutuante. Como _matherr é uma função de biblioteca, as funções intrínsecas matemáticas não a chamarão.

Para o tratamento de erro especial, você pode fornecer uma definição diferente de _matherr. Se usar a versão dinamicamente vinculada da biblioteca em CRT (tempo de execução de C), você poderá substituir a rotina padrão _matherr em um cliente executável por uma versão definida pelo usuário. No entanto, você não pode substituir a rotina padrão _matherr em um cliente DLL de CRT.

Quando ocorre um erro em uma rotina de matemática, _matherr é chamado com um ponteiro para uma estrutura de tipo _exception (definida em <math.h>) como um argumento. A estrutura _exception contém os seguintes elementos.

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
};

O membro type especifica o tipo de erro matemático. É um dos seguintes valores, definidos em <math.h>:

Macro Descrição
_DOMAIN Erro de domínio do argumento
_SING Singularidade do argumento
_OVERFLOW Erro de intervalo de estouro
_PLOSS Perda parcial de significância
_TLOSS Perda total de significância
_UNDERFLOW O resultado é muito pequeno para ser representado. (Não há suporte para essa condição no momento.)

O membro da estrutura name é um ponteiro de uma cadeia de caracteres terminada com caractere nulo, que contém o nome da função que causou o erro. Os membros da estrutura arg1 e arg2 especificam os valores que causaram o erro. Se apenas um argumento for dado, ele será armazenado em arg1.

O valor retornado padrão para o erro especificado é retval. Se você alterar o valor retornado, ele deverá especificar se realmente ocorreu um erro.

Requisitos

Rotina Cabeçalho necessário
_matherr <math.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

/* 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

Confira também

Suporte a matemática e ponto flutuante