Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
math_errhandling MATH_ERRNO MATH_ERREXCEPT
(C++11)
(C++11)
(C++11)
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