MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
Definiert im Header
<cmath>
|
||
|
#define MATH_ERRNO 1
|
(seit C++11) | |
|
#define MATH_ERREXCEPT 2
|
(seit C++11) | |
|
#define math_errhandling /*implementation defined*/
|
(seit C++11) | |
Die Makrokonstante
math_errhandling
expandiert zu einem Ausdruck vom Typ
int
, der entweder gleich
MATH_ERRNO
, oder gleich
MATH_ERREXCEPT
, oder gleich ihrem bitweisen ODER (
MATH_ERRNO
|
MATH_ERREXCEPT
) ist.
Der Wert von
math_errhandling
gibt die Art der Fehlerbehandlung an, die von den Gleitkomma-Operatoren und
Funktionen
durchgeführt wird:
| Konstante | Erklärung |
MATH_ERREXCEPT
|
Zeigt an, dass Gleitkomma-Ausnahmen verwendet werden: mindestens FE_DIVBYZERO , FE_INVALID , und FE_OVERFLOW sind in <cfenv> definiert. |
MATH_ERRNO
|
Zeigt an, dass Gleitkomma-Operationen die Variable errno zur Fehlerberichterstattung verwenden. |
Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt, math_errhandling & MATH_ERREXCEPT muss ungleich Null sein.
Die folgenden Gleitkomma-Fehlerbedingungen werden erkannt:
| Bedingung | Erklärung | errno | Gleitkomma-Ausnahme | Beispiel |
|---|---|---|---|---|
| Definitionsbereichsfehler | Das Argument liegt außerhalb des Bereichs, in dem die Operation mathematisch definiert ist (die Beschreibung jeder Funktion listet die erforderlichen Definitionsbereichsfehler auf) | EDOM | FE_INVALID | std:: acos ( 2 ) |
| Polstellenfehler | Das mathematische Ergebnis der Funktion ist exakt unendlich oder undefiniert | ERANGE | FE_DIVBYZERO | std:: log ( 0.0 ) , 1.0 / 0.0 |
| Wertebereichsfehler durch Überlauf | Das mathematische Ergebnis ist endlich, wird aber nach Rundung unendlich oder wird nach Abrundung zum größten darstellbaren endlichen Wert | ERANGE | FE_OVERFLOW | std:: pow ( DBL_MAX , 2 ) |
| Wertebereichsfehler durch Unterlauf | Das Ergebnis ist ungleich Null, wird aber nach Rundung zu Null oder wird subnormal mit Genauigkeitsverlust | 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 |
Hinweise
Ob FE_INEXACT von den mathematischen Bibliotheksfunktionen ausgelöst wird, ist im Allgemeinen nicht spezifiziert, kann jedoch explizit in der Beschreibung der Funktion angegeben werden (z.B. std::rint vs std::nearbyint ).
Vor C++11 waren Gleitkomma-Ausnahmen nicht spezifiziert, EDOM war für jeden Domain-Fehler erforderlich, ERANGE war für Überläufe erforderlich und implementierungsdefiniert für Unterläufe.
Beispiel
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "MATH_ERRNO ist " << (math_errhandling & MATH_ERRNO ? "gesetzt" : "nicht gesetzt") << '\n' << "MATH_ERREXCEPT ist " << (math_errhandling & MATH_ERREXCEPT ? "gesetzt" : "nicht gesetzt") << '\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 (Polstellenfehler) gemeldet\n"; }
Mögliche Ausgabe:
MATH_ERRNO ist gesetzt MATH_ERREXCEPT ist gesetzt log(0) = -inf errno = ERANGE (Numerical result out of range) FE_DIVBYZERO (Polstellenfehler) gemeldet
Siehe auch
|
Gleitkomma-Ausnahmen
(Makrokonstante) |
|
|
Makro, das zu einer POSIX-kompatiblen thread-lokalen Fehlernummer-Variable expandiert
(Makrovariable) |
|
|
C-Dokumentation
für
math_errhandling
|
|