MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
| Definiert in der Header-Datei <cmath> |
||
| #define MATH_ERRNO 1 |
(seit C++11) | |
| #define MATH_ERREXCEPT 2 |
(seit C++11) | |
| #define math_errhandling /*implementierungsdefiniert*/ |
(seit C++11) | |
Die Makrokonstante math_errhandling expandiert zu einem Ausdruck vom Typ int, der entweder gleich MATH_ERRNO, gleich MATH_ERREXCEPT oder deren bitweisem OR (MATH_ERRNO | MATH_ERREXCEPT) ist.
Der Wert von math_errhandling gibt die Art der Fehlerbehandlung an, die von den Gleitkommaoperatoren und Funktionen durchgeführt wird.
| Konstante | Erklärung |
MATH_ERREXCEPT
|
Gibt an, dass Gleitkomma-Ausnahmen verwendet werden: FE_DIVBYZERO, FE_INVALID und FE_OVERFLOW sind zumindest in <cfenv> definiert. |
MATH_ERRNO
|
Gibt an, dass Gleitkommaoperationen die Variable errno zur Fehlerberichterstattung verwenden. |
Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt, muss math_errhandling & MATH_ERREXCEPT ungleich Null sein.
Die folgenden Gleitkomma-Fehlerbedingungen werden erkannt
| Bedingung | Erklärung | errno | Gleitkomma-Ausnahme | Beispiel |
|---|---|---|---|---|
| Domänenfehler | Das Argument liegt außerhalb des Bereichs, in dem die Operation mathematisch definiert ist (die Beschreibung jeder Funktion listet die erforderlichen Domänenfehler auf) | EDOM | FE_INVALID | std::acos(2) |
| Polfehler | Das mathematische Ergebnis der Funktion ist exakt unendlich oder undefiniert | ERANGE | FE_DIVBYZERO | std::log(0.0), 1.0 / 0.0 |
| Bereichsfehler aufgrund von Überlauf | Das mathematische Ergebnis ist endlich, wird aber nach der Rundung unendlich oder wird nach der Abrundung zum größten darstellbaren endlichen Wert | ERANGE | FE_OVERFLOW | std::pow(DBL_MAX, 2) |
| Bereichsfehler aufgrund von Unterlauf | Das Ergebnis ist ungleich Null, wird aber nach der Rundung zu Null oder wird subnormal mit Präzisionsverlust | ERANGE oder unverändert (implementierungsdefiniert) | FE_UNDERFLOW oder nichts (implementierungsdefiniert) | DBL_TRUE_MIN / 2 |
| Ungenaues Ergebnis | Das Ergebnis muss gerundet werden, um in den Zieltyp zu passen | Unverändert | FE_INEXACT oder nichts (nicht spezifiziert) | std::sqrt(2), 1.0 / 10.0 |
[bearbeiten] Hinweise
Ob FE_INEXACT von den mathematischen Bibliotheksfunktionen ausgelöst wird, ist im Allgemeinen nicht spezifiziert, kann aber in der Beschreibung der Funktion explizit angegeben sein (z. B. std::rint vs std::nearbyint).
Vor C++11 waren Gleitkomma-Ausnahmen nicht spezifiziert, EDOM war für alle Domänenfehler erforderlich, ERANGE war für Überläufe erforderlich und implementierungsdefiniert für Unterläufe.
[bearbeiten] Beispiel
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "MATH_ERRNO is " << (math_errhandling & MATH_ERRNO ? "set" : "not set") << '\n' << "MATH_ERREXCEPT is " << (math_errhandling & MATH_ERREXCEPT ? "set" : "not set") << '\n'; std::feclearexcept(FE_ALL_EXCEPT); errno = 0; std::cout << "log(0) = " << std::log(0) << '\n'; if (errno == ERANGE) std::cout << "errno = ERANGE (" << std::strerror(errno) << ")\n"; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "FE_DIVBYZERO (pole error) reported\n"; }
Mögliche Ausgabe
MATH_ERRNO is set MATH_ERREXCEPT is set log(0) = -inf errno = ERANGE (Numerical result out of range) FE_DIVBYZERO (pole error) reported
[bearbeiten] Siehe auch
| Gleitkomma-Ausnahmen (macro constant) | |
| Makro, das zur POSIX-kompatiblen, Thread-lokalen Fehlernummern-Variable expandiert (Makrovariable) | |
| C-Dokumentation für math_errhandling
| |