_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 yerrno
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 yerrno
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