Partager via


_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é et errno 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é et errno reste inchangé.

Pour plus d’informations sur les codes de retour, consultez , , _sys_errlist_doserrnoet _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 mathématique et à virgule flottante