.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MATH_ERROR 7 "15. September 2017" Linux Linux\-Programmierhandbuch .SH BEZEICHNUNG math_error \- Erkennung von Fehlern mathematischer Funktionen .SH ÜBERSICHT .nf \fB#include \fP \fB#include \fP \fB#include \fP .fi .SH 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 \fI\fP deklarierten Funktionen einen Fehler mit anderen Mechanismen an. Es gibt zwei Mechanismen für das Berichten von Fehlern: Der ältere setzt \fIerrno\fP; der neuere wird in \fBfenv\fP(3) beschrieben und nutzt den Fließkomma\-Ausnahmemechanismus (die Verwendung von \fBfeclearexcept\fP(3) und \fBfetestexcept\fP(3), wie im Folgenden skizziert). .PP Ein portables Programm, das auf Fehler beim Aufruf mathematischer Funktionen prüfen muss, sollte \fIerrno\fP auf Null setzen und .PP .in +4n .EX feclearexcept(FE_ALL_EXCEPT); .EE .in .PP aufrufen, bevor es eine mathematische Funktion aufruft. .PP Ist nach Abschluss der mathematischen Funktionen \fIerrno\fP ungleich Null oder der folgende Aufruf (siehe \fBfenv\fP(3)) gibt einen Wert ungleich Null zurück .PP .in +4n .EX fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); .EE .in .PP .\" enum .\" { .\" FE_INVALID = 0x01, .\" __FE_DENORM = 0x02, .\" FE_DIVBYZERO = 0x04, .\" FE_OVERFLOW = 0x08, .\" FE_UNDERFLOW = 0x10, .\" FE_INEXACT = 0x20 .\" }; trat in der mathematischen Funktion ein Fehler auf. .PP Im Folgenden werden die Fehlerbedingungen beschrieben, die bei mathematischen Funktionen auftreten können. .SS Argumentfehler Ein \fIArgumentfehler\fP 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 \fBlog\fP(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); \fIerrno\fP wird auf \fBEDOM\fP gesetzt und die Fließkomma\-Ausnahme »ungültig« (\fBFE_INVALID\fP) wird ausgelöst. .SS Polfehler Ein \fIPolfehler\fP 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 (\fIdouble\fP, \fIfloat\fP oder \fIlong double\fP) den (vorzeichenbehafteten) Wert \fBHUGE_VAL\fP, \fBHUGE_VALF\fP oder \fBHUGE_VALL\fP zurück. Das Vorzeichen des Ergebnisses ist das mathematisch korrekte Vorzeichen für die Funktion. \fIerrno\fP wird auf \fBERANGE\fP gesetzt und die Fließkomma\-Ausnahme »Division durch Null« (\fBFE_DIVBYZERO\fP) wird ausgelöst. .SS Bereichsfehler Ein \fIBereichsfehler\fP 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. .PP Ein Fließkomma\-Ergebnis \fIläuft über\fP, wenn das Ergebnis endlich, aber zu groß für die Darstellung im Datentyp des Ergebnisses ist. Wenn ein Überlauf eintritt, gibt die Funktion abhängig vom Typ des Funktionsergebnisses (\fIdouble\fP, \fIfloat\fP oder \fIlong double\fP) den Wert \fBHUGE_VAL\fP, \fBHUGE_VALF\fP oder \fBHUGE_VALL\fP zurück. \fIerrno\fP wird auf \fBERANGE\fP gesetzt und die Fließkomma\-Ausnahme »Überlauf« (\fBFE_OVERFLOW\fP) wird ausgelöst. .PP Ein Fließkomma\-Ergebnis \fIläuft unter\fP, wenn das Ergebnis zu klein für die Darstellung im Datentyp des Ergebnisses ist. Wenn ein Unterlauf eintritt, gibt die Funktion typischerweise 0.0 zurück. (C99 fordert, dass der Rückgabewert einer Funktion »ein von der Implementierung definierter Wert sein muss, dessen Betrag nicht größer als der kleinste normalisierte Wert des spezifizierten Typs ist«.) \fIerrno\fP kann auf \fBERANGE\fP gesetzt und eine Fließkomma\-Ausnahme »Unterlauf« (\fBFE_UNDERFLOW\fP) kann ausgelöst werden. .PP Einige Funktionen geben einen Bereichsfehler zurück, wenn der übergebene Argumentwert oder das korrekte Ergebnis der Funktion \fIsubnormal\fP sein würden. 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 führende Nullen in der Mantisse enthalten. .SH ANMERKUNGEN .\" See CONFORMANCE in the glibc 2.8 (and earlier) source. Die von C99 und POSIX.1 spezifizierte Kennung \fImath_errhandling\fP wird von der Glibc nicht unterstützt. Diese Kennung soll angeben, welches der beiden Verfahren zur Fehlermeldung (\fIerrno\fP, Ausnahmen abrufbar über \fBfettestexcept\fP(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 \fIerrno\fP. Einige Funktionen setzen \fIerrno\fP, 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. .PP .\" http://www.securecoding.cert.org/confluence/display/seccode/FLP32-C.+Prevent+or+detect+domain+and+range+errors+in+math+functions Um die komplizierte Anwendung von \fIerrno\fP und \fBfetestexcept\fP(3) bei der Fehlerprüfung zu vermeiden, wird oft empfohlen, stattdessen vor jedem Aufruf die Güte der Argumentwerte zu prüfen. So sorgt beispielsweise der folgende Code dafür, dass das Argument für \fBlog\fP(3) kein NaN und nicht Null (ein Polfehler) oder kleiner als Null (ein Argumentfehler) ist. .PP .in +4n .EX double x, r; if (isnan(x) || islessequal(x, 0)) { /* Fehlerbehandlung für NaN / Polfehler / Argumentfehler */ } r = log(x); .EE .in .PP Die Diskussion auf dieser Seite gilt nicht für die mathematischen Funktionen auf komplexen Zahlen (d.h. solche, die in \fI\fP deklariert werden). Von diesen erwarten C99 and POSIX.1 keine Anzeige von Fehlern. .PP Die \fBgcc\fP(1)\-Option \fI\-fno\-math\-errno\fP bewirkt, dass die ausführbare Datei Implementierungen einiger mathematischer Funktionen verwendet, die schneller als die Standard\-Implementierungen sind, aber im Fehlerfall \fIerrno\fP nicht setzen. (Die \fBgcc\fP(1)\-Option \fI\-ffast\-math\fP aktiviert ebenfalls \fI\-fno\-math\-errno\fP.) Nach Fehlern kann immer noch mittels \fBfetestexcept\fP(3) gesucht werden. .SH "SIEHE AUCH" \fBgcc\fP(1), \fBerrno\fP(3), \fBfenv\fP(3), \fBfpclassify\fP(3), \fBINFINITY\fP(3), \fBisgreater\fP(3), \fBmatherr\fP(3), \fBnan\fP(3) .PP \fIinfo libc\fP .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 5.04 des Projekts Linux\-\fIman\-pages\fP. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter \%https://www.kernel.org/doc/man\-pages/. .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@\:lists.\:debian.\:org Mailingliste der Übersetzer .ME .