math_error(7) Miscellaneous Information Manual math_error(7) BEZEICHNUNG math_error - Erkennung von Fehlern mathematischer Funktionen UBERSICHT #include #include #include BESCHREIBUNG Wenn ein Fehler eintritt, zeigen die meisten Bibliotheksfunktionen diesen Umstand durch Ruckgabe eines speziellen Wertes an (z.B. -1 oder NULL). Weil sie normalerweise eine Fliesskomma-Zahl zuruckgeben, zeigen die in deklarierten Funktionen einen Fehler mit anderen Mechanismen an. Es gibt zwei Mechanismen fur das Berichten von Fehlern: Der altere setzt errno; der neuere wird in fenv(3) beschrieben und nutzt den Fliesskomma-Ausnahmemechanismus (die Verwendung von feclearexcept(3) und fetestexcept(3), wie im Folgenden skizziert). Ein portables Programm, das auf Fehler beim Aufruf mathematischer Funktionen prufen muss, sollte errno auf Null setzen und feclearexcept(FE_ALL_EXCEPT); aufrufen, bevor es eine mathematische Funktion aufruft. Ist nach Abschluss der mathematischen Funktionen errno ungleich Null oder der folgende Aufruf (siehe fenv(3)) gibt einen Wert ungleich Null zuruck fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); trat in der mathematischen Funktion ein Fehler auf. Im Folgenden werden die Fehlerbedingungen beschrieben, die bei mathematischen Funktionen auftreten konnen. Argumentfehler Ein Argumentfehler liegt vor, wenn einer mathematischen Funktion ein Argument ubergeben wird, dessen Wert ausserhalb des Definitionsbereichs der Funktion liegt (z.B. ein negatives Argument fur log(3)). Wenn ein Argumentfehler vorliegt, geben mathematische Funktionen ublicherweise ein NaN zuruck (allerdings geben manche Funktionen in diesem Fall einen anderen Wert zuruck); errno wird auf EDOM gesetzt und die Fliesskomma-Ausnahme >>ungultig<< (FE_INVALID) wird ausgelost. 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 abhangig vom Typ des Funktionsergebnisses (double, float oder long double) den (vorzeichenbehafteten) Wert HUGE_VAL, HUGE_VALF oder HUGE_VALL zuruck. Das Vorzeichen des Ergebnisses ist das mathematisch korrekte Vorzeichen fur die Funktion. errno wird auf ERANGE gesetzt und die Fliesskomma-Ausnahme >>Division durch Null<< (FE_DIVBYZERO) wird ausgelost. Bereichsfehler Ein Bereichsfehler tritt ein, wenn der Betrag des Funktionsergebnisses nicht im Ergebnisdatentyp der Funktion dargestellt werden kann. Der Ruckgabewert der Funktion hangt davon ab, ob der Bereichsfehler ein Uberlauf oder ein Unterlauf war. Ein Fliesskomma-Ergebnis lauft uber, wenn das Ergebnis endlich, aber zu gross fur die Darstellung im Datentyp des Ergebnisses ist. Wenn ein Uberlauf eintritt, gibt die Funktion abhangig vom Typ des Funktionsergebnisses (double, float oder long double) den Wert HUGE_VAL, HUGE_VALF oder HUGE_VALL zuruck. errno wird auf ERANGE gesetzt und die Fliesskomma-Ausnahme >>Uberlauf<< (FE_OVERFLOW) wird ausgelost. Ein Fliesskomma-Ergebnis lauft unter, wenn das Ergebnis zu klein fur die Darstellung im Datentyp des Ergebnisses ist. Wenn ein Unterlauf eintritt, gibt die Funktion typischerweise 0.0 zuruck. (C99 fordert, dass der Ruckgabewert einer Funktion >>ein von der Implementierung definierter Wert sein muss, dessen Betrag nicht grosser als der kleinste normalisierte Wert des spezifizierten Typs ist<<.) errno kann auf ERANGE gesetzt und eine Fliesskomma-Ausnahme >>Unterlauf<< (FE_UNDERFLOW) kann ausgelost werden. Einige Funktionen geben einen Bereichsfehler zuruck, wenn der ubergebene Argumentwert oder das korrekte Ergebnis der Funktion subnormal sein wurden. Ein subnormaler Wert ist von Null verschieden, aber sein Betrag ist so klein, dass er nicht in normierter Form (d.h. mit einer 1 im signifikantesten Bit der Mantisse) dargestellt werden kann. Die Darstellung einer subnormalen Zahl wird eine oder mehrere fuhrende Nullen in der Mantisse enthalten. ANMERKUNGEN Die von C99 und POSIX.1 spezifizierte Kennung math_errhandling wird von der Glibc nicht unterstutzt. Diese Kennung soll angeben, welches der beiden Verfahren zur Fehlermeldung (errno, Ausnahmen abrufbar uber fetestexcept(3)) verwendet wird. Die Standards fordern, dass mindestens eins im Einsatz ist, erlauben aber, dass beide zur Verfugung stehen. Die aktuelle Situation unter Glibc (Glibc 2.8) ist etwas chaotisch. Die meisten (aber nicht alle) Funktionen losen bei Fehlern Ausnahmen aus. Einige setzen zusatzlich errno. Einige Funktionen setzen errno, losen aber keine Ausnahme aus. Einige wenige Funktionen tun weder das Eine noch das Andere. Weitere Einzelheiten finden Sie auf den zugehorigen Handbuchseiten. Um die komplizierte Anwendung von errno und fetestexcept(3) bei der Fehlerprufung zu vermeiden, wird oft empfohlen, stattdessen vor jedem Aufruf die Gute der Argumentwerte zu prufen. So sorgt beispielsweise der folgende Code dafur, dass das Argument fur log(3) kein NaN und nicht Null (ein Polfehler) oder kleiner als Null (ein Argumentfehler) ist. double x, r; if (isnan(x) || islessequal(x, 0)) { /* Fehlerbehandlung fur NaN / Polfehler / Argumentfehler */ } r = log(x); Die Diskussion auf dieser Seite gilt nicht fur die mathematischen Funktionen auf komplexen Zahlen (d.h. solche, die in deklariert werden). Von diesen erwarten C99 and POSIX.1 keine Anzeige von Fehlern. Die gcc(1)-Option -fno-math-errno bewirkt, dass die ausfuhrbare Datei Implementierungen einiger mathematischer Funktionen verwendet, die schneller als die Standard-Implementierungen sind, aber im Fehlerfall errno nicht setzen. (Die gcc(1)-Option -ffast-math aktiviert ebenfalls -fno-math-errno.) Nach Fehlern kann immer noch mittels fetestexcept(3) gesucht werden. SIEHE AUCH gcc(1), errno(3), fenv(3), fpclassify(3), INFINITY(3), isgreater(3), matherr(3), nan(3) info libc UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 math_error(7)