Compartir por


_matherr

Trata errores matemáticos.

Sintaxis

int _matherr(struct _exception *except);

Parámetros

except
Puntero a la estructura que contiene información de error.

Valor devuelto

_matherr devuelve 0 para indicar un error, o un valor distinto de cero para indicar que la operación es correcta:

  • Si _matherr devuelve 0, se puede mostrar un mensaje de error y errno se establece en el valor de error que corresponda.
  • Si _matherr devuelve un valor distinto de cero, no se muestra ningún mensaje de error y errno permanece sin cambios.

Para obtener más información sobre los códigos de retorno, vea errno, _doserrno, _sys_errlist y _sys_nerr.

Comentarios

La función _matherr procesa los errores generados por las funciones de punto flotante de la biblioteca matemática. Estas funciones llaman a _matherr cuando se detecta un error. Esta interacción no se ve afectada por el modo de punto flotante del compilador ni por la palabra de control de punto flotante. Como _matherr es una función de biblioteca, las funciones intrínsecas matemáticas no lo llamarán.

Para llevar a cabo un control de errores especial, puede proporcionar una definición diferente de _matherr. Si usa la versión vinculada dinámicamente de la biblioteca en tiempo de ejecución de C (CRT), puede reemplazar la rutina _matherr predeterminada en un ejecutable de cliente por una versión definida por el usuario, pero no puede reemplazar la rutina _matherr predeterminada en un cliente DLL de la DLL de CRT.

Si se produce un error en una rutina matemática, se llama a _matherr con un puntero a una estructura de tipo _exception (definida en <math.h>) como argumento. La estructura _exception contiene los siguientes 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
};

type especifica el tipo de error matemático. Es uno de los valores siguientes, definidos en <math.h>:

Macro Descripción
_DOMAIN Error de dominio de argumento
_SING Singularidad de argumento
_OVERFLOW Error de intervalo de desbordamiento
_PLOSS Pérdida parcial de significado
_TLOSS Pérdida total de significado
_UNDERFLOW El resultado es demasiado pequeño para representarlo (esta condición no se admite actualmente).

El miembro de estructura name es un puntero a una cadena terminada en nulo que contiene el nombre de la función que produjo el error. Los miembros de estructura arg1 y arg2 especifican los valores que provocaron el error (si solo se proporciona un argumento, se almacena en arg1).

El valor devuelto predeterminado del error indicado es retval. Si cambia el valor devuelto, se debe especificar si realmente se produjo un error.

Requisitos

Routine Encabezado necesario
_matherr <math.h>

Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

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

Vea también

Compatibilidad con cálculos matemáticos y el punto flotante