Freigeben über


_matherr

Behandlung von Mathematikfehlern

Syntax

int _matherr(struct _exception *except);

Parameter

except
Ein Zeiger auf die Struktur, die Fehlerinformationen enthält.

Rückgabewert

_matherr gibt 0 zurück, um einen Fehler anzugeben, oder einen Wert ungleich Null, um den Erfolg anzuzeigen:

  • Wenn _matherr 0 zurückgegeben wird, kann eine Fehlermeldung angezeigt errno und auf einen entsprechenden Fehlerwert festgelegt werden.
  • Wenn _matherr ein Wert ungleich Null zurückgegeben wird, wird keine Fehlermeldung angezeigt und errno bleibt unverändert.

Weitere Informationen zu Rückgabecodes finden Sie unter , , _doserrno, _sys_errlistund _sys_nerr.errno

Hinweise

Die _matherr Funktion verarbeitet Fehler, die von den Gleitkommafunktionen der Mathematischen Bibliothek generiert werden. Diese Funktionen rufen auf _matherr , wenn ein Fehler erkannt wird. Diese Interaktion wirkt sich nicht auf den Gleitkommamodus des Compilers oder das Gleitkomma-Steuerelementwort aus. Da _matherr es sich um eine Bibliotheksfunktion handelt, werden systeminterne mathematische Funktionen nicht aufgerufen.

Für eine spezielle Fehlerbehandlung können Sie eine andere Definition von _matherr. Wenn Sie die dynamisch verknüpfte Version der C-Laufzeitbibliothek (C Run-Time Library, CRT) verwenden, können Sie die Standardroutine _matherr in einer ausführbaren Clientdatei durch eine benutzerdefinierte Version ersetzen. Sie können die Standardroutine _matherr jedoch nicht in einem DLL-Client der CRT-DLL ersetzen.

Wenn in einer mathematischen Routine ein Fehler auftritt, _matherr wird mit einem Zeiger auf eine _exception Typstruktur (definiert in <math.h>) als Argument aufgerufen. Die _exception Struktur enthält die folgenden Elemente.

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
};

Das type Element gibt den Typ des mathematischen Fehlers an. Es ist einer der folgenden Werte, definiert in <math.h>:

Makro Beschreibung
_DOMAIN Argumentdomänenfehler
_SING Argument-Singularität
_OVERFLOW Überlaufbereichsfehler
_PLOSS Teilweiser Verlust der Bedeutung
_TLOSS Gesamtverlust der Bedeutung
_UNDERFLOW Das Ergebnis ist zu klein, um dargestellt werden zu können. (Diese Bedingung wird derzeit nicht unterstützt.)

Das Strukturelement name ist ein Zeiger auf eine mit Null beendete Zeichenfolge, die den Namen der Funktion enthält, die den Fehler verursacht hat. Die Strukturmber arg1 und arg2 die Werte angeben, die den Fehler verursacht haben. Wenn nur ein Argument angegeben wird, wird es in arg1.

Der Standardwert für den angegebenen Fehler ist retval. Wenn Sie den Rückgabewert ändern, muss dieser angeben, ob ein Fehler wirklich passiert ist.

Anforderungen

Routine Erforderlicher Header
_matherr <math.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

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

Siehe auch

Mathematische Unterstützung und Gleitkommaunterstützung