_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 angezeigterrno
und auf einen entsprechenden Fehlerwert festgelegt werden. - Wenn
_matherr
ein Wert ungleich Null zurückgegeben wird, wird keine Fehlermeldung angezeigt underrno
bleibt unverändert.
Weitere Informationen zu Rückgabecodes finden Sie unter , , _doserrno
, _sys_errlist
und _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