table of contents
MATH_ERROR(7) | Linux-Programmierhandbuch | MATH_ERROR(7) |
BEZEICHNUNG¶
math_error - Erkennung von Fehlern mathematischer FunktionenÜBERSICHT¶
#include <math.h> #include <errno.h> #include <fenv.h>
BESCHREIBUNG¶
Wenn ein Fehler eintritt, zeigen die meisten Bibliotheksfunktionen diesen Umstand durch Rückgabe eines speziellen Wertes an (z.B. -1 oder NULL). Weil sie normalerweise eine Fließkomma-Zahl zurückgeben, zeigen die in <math.h> deklarierten Funktionen einen Fehler mit anderen Mechanismen an. Es gibt zwei Mechanismen für das Berichten von Fehlern: Der ältere setzt errno; der neuere wird in fenv(3) beschrieben und nutzt den Fließkomma-Ausnahmemechanismus (die Verwendung von feclearexcept(3) und fetestexcept(3), wie im Folgenden skizziert).feclearexcept(FE_ALL_EXCEPT);
aufrufen, bevor es eine mathematische Funktion aufruft.
fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW);
trat in der mathematischen Funktion ein Fehler auf.
Argumentfehler¶
Ein Argumentfehler liegt vor, wenn einer mathematischen Funktion ein Argument übergeben wird, dessen Wert außerhalb des Definitionsbereichs der Funktion liegt (z.B. ein negatives Argument für log(3)). Wenn ein Argumentfehler vorliegt, geben mathematische Funktionen üblicherweise ein NaN zurück (allerdings geben manche Funktionen in diesem Fall einen anderen Wert zurück); errno wird auf EDOM gesetzt und die Fließkomma-Ausnahme »ungültig« ( FE_INVALID) wird ausgelöst.Polfehler¶
Ein Polfehler tritt ein, wenn das mathematische Ergebnis einer Funktion exakt unendlich ist (z.B. ist der Logarithmus von 0 minus unendlich). Wenn ein Polfehler eintritt, gibt die Funktion abhängig vom Typ des Funktionsergebnisses ( double, float oder long double) den (vorzeichenbehafteten) Wert HUGE_VAL, HUGE_VALF oder HUGE_VALL zurück. Das Vorzeichen des Ergebnisses ist das mathematisch korrekte Vorzeichen für die Funktion. errno wird auf ERANGE gesetzt und die Fließkomma-Ausnahme »Division durch Null« ( FE_DIVBYZERO) wird ausgelöst.Bereichsfehler¶
Ein Bereichsfehler tritt ein, wenn der Betrag des Funktionsergebnisses nicht im Ergebnisdatentyp der Funktion dargestellt werden kann. Der Rückgabewert der Funktion hängt davon ab, ob der Bereichsfehler ein Überlauf oder ein Unterlauf war.ANMERKUNGEN¶
Die von C99 und POSIX.1-2001 spezifizierte Kennung math_errhandling wird von der Glibc nicht unterstützt. Diese Kennung soll angeben, welches der beiden Verfahren zur Fehlermeldung ( errno, Ausnahmen abrufbar über fettestexcept(3)) verwendet wird. Die Standards fordern, dass mindestens eins im Einsatz ist, erlauben aber, dass beide zur Verfügung stehen. Die aktuelle Situation unter Glibc (Version 2.8) ist etwas chaotisch. Die meisten (aber nicht alle) Funktionen lösen bei Fehlern Ausnahmen aus. Einige setzen zusätzlich errno. Einige Funktionen setzen errno, lösen aber keine Ausnahme aus. Einige wenige Funktionen tun weder das Eine noch das Andere. Weitere Einzelheiten finden Sie auf den zugehörigen Handbuchseiten.double x, r; if (isnan(x) || islessequal(x, 0)) { /* Fehlerbehandlung für NaN / Polfehler / Argumentfehler */ } r = log(x);
Die Diskussion auf dieser Seite gilt nicht für die mathematischen Funktionen auf komplexen Zahlen (d.h. solche, die in <complex.h> deklariert werden). Von diesen erwarten C99 and POSIX.1-2001 keine Anzeige von Fehlern.
SIEHE AUCH¶
gcc(1), errno(3), fenv(3), fpclassify(3), INFINITY(3), isgreater(3), matherr(3), nan(3)KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux- man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, finden sich unter http://www.kernel.org/doc/man-pages/.ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.11. August 2008 | Linux |