_matherr
Gère les erreurs mathématiques.
Syntaxe
int _matherr(struct _exception *except);
Paramètres
except
Pointeur vers la structure contenant des informations sur l’erreur.
Valeur retournée
_matherr
retourne 0 pour indiquer une erreur ou une valeur différente de zéro pour indiquer la réussite :
- Si
_matherr
cette propriété renvoie 0, un message d’erreur peut être affiché eterrno
est défini sur une valeur d’erreur appropriée. - Si
_matherr
elle retourne une valeur différente de zéro, aucun message d’erreur n’est affiché eterrno
reste inchangé.
Pour plus d’informations sur les codes de retour, consultez , , _sys_errlist
_doserrno
et _sys_nerr
.errno
Notes
La _matherr
fonction traite les erreurs générées par les fonctions à virgule flottante de la bibliothèque mathématique. Ces fonctions appellent _matherr
lorsqu’une erreur est détectée. Cette interaction n’est pas affectée par le mode à virgule flottante du compilateur ou le mot de contrôle à virgule flottante. Étant donné qu’il _matherr
s’agit d’une fonction de bibliothèque, les fonctions intrinsèques mathématiques ne l’appellent pas.
Pour la gestion spéciale des erreurs, vous pouvez fournir une définition différente de _matherr
. Si vous utilisez la version liée dynamiquement de la bibliothèque runtime C (CRT), vous pouvez remplacer la routine par défaut _matherr
dans un exécutable client par une version définie par l’utilisateur. Toutefois, vous ne pouvez pas remplacer la routine par défaut _matherr
dans un client DLL de la DLL CRT.
Lorsqu’une erreur se produit dans une routine mathématique, _matherr
est appelée avec un pointeur vers une _exception
structure de type (définie dans <math.h>
) en tant qu’argument. La _exception
structure contient les éléments suivants.
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
};
Le type
membre spécifie le type d’erreur mathématique. Il s’agit de l’une des valeurs suivantes, définies dans <math.h>
:
Macro | Description |
---|---|
_DOMAIN |
Erreur de domaine d’argument |
_SING |
Singularité de l’argument |
_OVERFLOW |
Erreur de plage avec dépassement |
_PLOSS |
Perte partielle de signification |
_TLOSS |
Perte totale d’importance |
_UNDERFLOW |
Le résultat est trop petit pour être représenté. (Cette condition n’est actuellement pas prise en charge.) |
Le membre name
de structure est un pointeur vers une chaîne terminée par null contenant le nom de la fonction qui a provoqué l’erreur. Les membres arg1
de la structure et arg2
spécifient les valeurs qui ont provoqué l’erreur. Si un seul argument est donné, il est stocké dans arg1
.
La valeur de retour par défaut de l’erreur donnée est retval
. Si vous modifiez la valeur de retour, elle doit spécifier si une erreur s’est effectivement produite.
Spécifications
Routine | En-tête requis |
---|---|
_matherr |
<math.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
/* 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
Voir aussi
Prise en charge des fonctions mathématiques et à virgule flottante