home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------------
- * Dateiname - matherr.c
- *
- * Funktion matherr - Behandlung mathematischer Fehler
- *-----------------------------------------------------------------------*/
-
- /*[]---------------------------------------------------[]*/
- /*| |*/
- /*| Turbo C Runtime-Bibliothek |*/
- /*| |*/
- /*| |*/
- /*| Copyright (c) 1987,1990 by Borland International |*/
- /*| Alle Rechte vorbehalten. |*/
- /*| |*/
- /*[]---------------------------------------------------[]*/
-
-
- #include <math.h>
-
- #ifdef UNIX_matherr
- #include <stdio.h>
- #include <process.h>
-
- char *whyS [] =
- {
- "argument domain error",
- "argument singularity ",
- "overflow range error ",
- "underflow range error",
- "total loss of significance",
- "partial loss of significance"
- };
-
- /*------------------------------------------------------------------------*
-
- Name matherr - Behandlung mathematischer Fehler
-
- Gebrauch include <math.h>
- int matherr(struct exception *e);
-
- Prototyp in math.h
-
- Beschreibung Wenn in der Mathematik-Bibliothek Probleme entdeckt werden,
- wird _matherr() mit allen verfügbaren Informationen aufge-
- rufen.
-
- Die Funktion führt relativ wenig aus, sie schreibt die
- Ursache des Problems (ERANGE oder EDOMAIN) in errno.
- Sie dient hauptsächlich als Mittelpunkt für Änderungen
- in der Fehlerbehandlung.
-
- Wenn Sie zum Beispiel eine Tabellenkalkulation schreiben,
- könnten Sie diese Funktion durch eine andere ersetzen, die
- eine Fehlermeldung in einem Fenster zeigt:
-
- "log (-2.0) caused domain error, in cell J7"
-
- und dann mit longjmp() in einen Reset-Zustand springen um
- den nächsten Befehl des Anwenders zu warten.
-
- Die Standardversion der Turbo C-matherr-Routine meldet
- keine Underflow- und Precision-Fehler; andere Fehler werden
- als schwerwiegend angesehen. matherr dient als Grundlage,
- auf der Sie aufsetzen sollten, wenn Sie Ihre eigene
- Fehlerbehandlungsroutine schreiben.
-
- Der Grund für das Nichtmelden der Underflow- und Precision-
- Fehler ist, daß diese Fehler nicht in ANSI C spezifiziert
- sind. Daher bekommen Sie
- exp(-1000) = 0
- sin(1e100) = NAN
- ohne Fehler oder Warnung, auch wenn in beiden Fällen die
- gesamte Rechengenauigkeit verloren geht. Solche Probleme
- können Sie durch Ihre eigene matherr-Routine abfangen.
-
- Mögliche Fehler sind DOMAIN, SING, OVERFLOW, UNDERFLOW,
- TLOSS, PLOSS (in <math.h> aufgeführt). Wie schon oben erklärt,
- werden UNDERFLOW und TLOSS von der Standard-matherr behandelt.
- PLOSS wird von Turbo C nicht unterstützt und wird von
- keiner Bibliotheksfunktion erzeugt.
-
- Sie können matherr dahingehend modifizieren, daß sie zu
- einer an Ihre Anwendungen angepaßten Fehler-Routine wird.
- Sie sollte 0 zurückgeben, wenn es nicht möglich war, einen
- Fehler zu beheben, und einen Wert ungleich Null, wenn ein
- Fehler korrigiert worden ist. Wenn matherr 0 zurückgibt, wird
- weder errno geändert noch eine Fehlermeldung ausgegeben.
-
- Wir wissen natürlich nicht, welche Fehlerbehandlung Sie
- möchten, aber Sie können sicher sein, daß alle Fehler mit
- allen zur Verfügung stehenden Informationen bei matherr() an-
- kommen, so daß Sie Ihre Lösungen frei gestalten können.
-
- In Turbo C ist nicht die Funktion matherr() integriert, die
- UNIX-Benutzer kennen, da der ANSI x3j11 Draft eine inkompa-
- tible Version unterstützt. Die Version, die Sie erhalten, ist
- so kompatibel wie möglich, ohne die ANSI-Regeln zu brechen.
- Natürlich können Sie sie auch in eine UNIX-Version kon-
- vertieren. Der notwendige Code ist bereits vorhanden, Sie
- müssen ihn nur noch aktivieren.
-
- Rückgabewert Der Standard-Rückgabewert von matherr ist 0. Matherr kann
- aber auch e->retval verwenden, was das Ergebnis über
- _matherr zum Aufrufenden zurückgibt.
-
- Wenn matherr 0 zurückgibt (und damit meldet, daß der Fehler
- nicht behoben werden konnte), wird eine Fehlermeldung ausge-
- geben und Errno ein Wert zugewiesen.
-
- Wenn matherr einen Wert ungleich Null zurückgibt (und damit
- meldet, daß der Fehler behoben werden konnte), wird weder
- eine Meldung ausgegeben noch errno ein Wert zugewiesen.
-
- *-------------------------------------------------------------------------*/
- int matherr (struct exception *e)
- {
- fprintf (stderr,
- "%s (%8g,%8g): %s\n", e->name, e->arg1, e->arg2, whyS [e->type - 1]);
-
- exit (1);
- }
- #else
-
- int matherr(struct exception *e)
- {
- if (e->type == UNDERFLOW)
- {
- e->retval = 0;
- return 1;
- }
- if (e->type == TLOSS)
- {
- /* Genauigkeitsverlust, doch das Problem wird ignoriert */
- return 1;
- }
- /* alle anderen Fehler sind fatal */
- return 0;
- }
-
-
- #endif