_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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour