MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
| Definiert in Header <math.h> |
||
| #define MATH_ERRNO 1 |
(seit C99) | |
| #define MATH_ERREXCEPT 2 |
(seit C99) | |
| #define math_errhandling /*implementation defined*/ |
(seit C99) | |
Der Makrokonstante math_errhandling expandiert zu einem Ausdruck vom Typ int, der entweder gleich MATH_ERRNO, oder gleich MATH_ERREXCEPT, oder gleich deren bitweisem ODER (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-Exceptions verwendet werden: mindestens FE_DIVBYZERO, FE_INVALID und FE_OVERFLOW sind in <fenv.h> definiert. |
MATH_ERRNO
|
gibt an, dass Gleitkommaoperationen die Variable errno zur Fehlerberichterstattung verwenden. |
Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt, muss math_errhandling & MATH_ERREXCEPT ungleich Null sein.
Die folgenden Gleitkommafehlerbedingungen werden erkannt
| Bedingung | Erklärung | errno | Gleitkomma-Exception | 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 | acos(2) |
| Polfehler | das mathematische Ergebnis der Funktion ist exakt unendlich oder undefiniert | ERANGE | FE_DIVBYZERO | log(0.0), 1.0/0.0 |
| Bereichsfehler aufgrund von Überlauf | das mathematische Ergebnis ist endlich, wird aber nach dem Runden unendlich oder nach dem Abrunden zum größten darstellbaren endlichen Wert | ERANGE | FE_OVERFLOW | pow(DBL_MAX,2) |
| Bereichsfehler aufgrund von Unterlauf | das Ergebnis ist ungleich Null, wird aber nach dem Runden Null oder wird subnormal mit einem Präzisionsverlust | ERANGE oder unverändert (implementierungsabhängig) | FE_UNDERFLOW oder nichts (implementierungsabhängig) | 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) | sqrt(2), 1.0/10.0 |
Inhalt |
[bearbeiten] Hinweise
Ob FE_INEXACT durch die mathematischen Bibliotheksfunktionen ausgelöst wird, ist im Allgemeinen nicht spezifiziert, kann aber in der Beschreibung der Funktion explizit angegeben werden (z.B. rint vs nearbyint).
Vor C99 waren Gleitkomma-Exceptions nicht spezifiziert, EDOM war für jeden Domänenfehler erforderlich, ERANGE war für Überläufe und implementierungsabhängig für Unterläufe erforderlich.
[bearbeiten] Beispiel
#include <stdio.h> #include <fenv.h> #include <math.h> #include <errno.h> #pragma STDC FENV_ACCESS ON int main(void) { printf("MATH_ERRNO is %s\n", math_errhandling & MATH_ERRNO ? "set" : "not set"); printf("MATH_ERREXCEPT is %s\n", math_errhandling & MATH_ERREXCEPT ? "set" : "not set"); feclearexcept(FE_ALL_EXCEPT); errno = 0; printf("log(0) = %f\n", log(0)); if(errno == ERANGE) perror("errno == ERANGE"); if(fetestexcept(FE_DIVBYZERO)) puts("FE_DIVBYZERO (pole error) reported"); }
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] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (S. 170)
- F.10/4 MATH_ERREXCEPT, math_errhandling (S. 377)
- C11-Standard (ISO/IEC 9899:2011)
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (S. 233)
- F.10/4 MATH_ERREXCEPT, math_errhandling (S. 517)
- C99-Standard (ISO/IEC 9899:1999)
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (S. 214)
- F.9/4 MATH_ERREXCEPT, math_errhandling> (S. 454)
[bearbeiten] Siehe auch
| Gleitkomma-Ausnahmen (macro constant) | |
| Makro, das zur POSIX-kompatiblen, Thread-lokalen Fehlernummern-Variable expandiert (Makrovariable) | |
| C++ Dokumentation für math_errhandling
| |