_matherr, _matherrl

Aus RAD Studio
Wechseln zu: Navigation, Suche

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