_matherr, _matherrl
Nach oben zu math.h - Index
Header-Datei
math.h
Kategorie
Diagnoseroutinen, mathematische Routinen
Prototyp
int _matherr(struct _exception *e);
int _matherrl(struct _exceptionl *e);
Beschreibung
Vom Benutzer änderbare Behandlungsroutine für mathematische Fehler.
_matherr wird aufgerufen, wenn eine Funktion aus der mathematischen Bibliothek einen Fehler erzeugt.
_matherrl ist die long double-Version. Sie wird aufgerufen, wenn eine mathematische Funktion für Werte des Typs long double einen Fehler generiert.
_matherr und _matherrl können vom Benutzer angepasst und durch eigene Fehlerbehandlungsroutinen für mathematische Funktionen ersetzt werden.
_matherr und _matherrl können Informationen zum Abfangen von durch mathematische Funktionen verursachten Domain- und Bereichsfehlern liefern. Sie fangen keine Gleitkomma-Exceptions ab, die z. B. durch eine Division durch 0 bedingt werden. Nähere Informationen zum Abfangen solcher Fehler finden Sie unter signal.
Sie können eine eigene _matherr- oder _matherrl-Funktion als benutzerdefinierte Fehlerbehandlungsroutine definieren (z. B. als Funktion, die bestimmte Fehlertypen erkennt und behebt). Diese benutzerdefinierte Funktion überschreibt die Standardversion aus der C-Bibliothek. Die benutzerdefinierte _matherr- oder _matherrl-Funktion sollte 0 zurückgeben, wenn der Fehler nicht behoben werden kann, und einen Wert ungleich 0, wenn der Fehler behoben wurde. Geben _matherr oder _matherrl einen Wert ungleich 0 zurück, und wird keine Fehlermeldung ausgegeben, dann wird die globale Variable errno nicht geändert.
Die (in math.h definierten) Strukturen _exception und _exceptionl sind wie folgt deklariert:
struct _exception {
int type;
char *name;
double arg1, arg2, retval;
};
struct _exceptionl {
int type;
char *name;
long double arg1, arg2, retval;
};
In der folgenden Tabelle werden die Elemente der Strukturen _exception und _exceptionl beschrieben:
type |
Der Typ des aufgetretenen mathematischen Fehlers; ein enum-Typ, der in der Typdefinition von _mexcep definiert ist (siehe Definition weiter unten). |
name |
Ein Zeiger auf einen nullterminierten String, der den Namen der mathematischen Bibliotheksfunktion enthält, die den Fehler verursacht hat. |
arg1, arg2 |
Die Argumente (die der Funktion übergeben wurden, auf die name zeigt), die den Fehler bedingten. Wurde der Funktion nur ein Argument übergeben, wird dieses in arg1 gespeichert. |
retval |
Der Standardrückgabewert von _matherr (bzw. _matherrl). Sie können diesen Wert ändern. |
Die in math.h definierte Typdefinition (typedef) von _mexcep enthält eine Auflistung der folgenden symbolischen Konstanten, die mögliche mathematische Fehler repräsentieren:
DOMAIN |
Das Argument lag außerhalb der Funktionsdomäne, z. B. log(-1). |
SING |
Das Argument hätte eine Singularität zur Folge, z. B. pow(0, -2). |
OVERFLOW |
Das Argument würde ein Funktionsergebnis erzeugen, das größer als DBL_MAX (bzw. LDBL_MAX) ist, z. B. exp(1000). |
UNDERFLOW |
Das Argument würde ein Funktionsergebnis erzeugen, das kleiner als DBL_MIN (bzw. LDBL_MIN) ist, z. B. exp(-1000). |
TLOSS |
Das Argument würde ein Funktionsergebnis ohne signifikante Stellen ergeben, z. B. sin(10e70). |
Die Makros DBL_MAX, DBL_MIN, LDBL_MAX und LDBL_MIN sind in float.h definiert.
Der Quelltext der vordefinierten Funktionen _matherr und _matherrl gehört zum Lieferumfang von C++Builder.
Das UNIX-artige Standardverhalten von _matherr und _matherrl (Meldung ausgeben und beenden) ist nicht ANSI-kompatibel. Wenn Sie diese Funktionen im UNIX-Stil benutzen möchten, verwenden Sie die zum Lieferumfang von C++Builder gehörigen Dateien MATHERR.C und MATHERRL.C.
Beispiel
#include <math.h>
#include <string.h>
#include <stdio.h>
int _matherr (struct _exception *a)
{
if (a->type == DOMAIN)
if (!strcmp(a->name,"sqrt")) {
a->retval = sqrt (-(a->arg1));
return 1;
}
return 0;
}
int main(void)
{
double x = -2.0, y;
y = sqrt(x);
printf("_Matherr corrected value: %lf\n",y);
return 0;
}