MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<math.h>
|
||
|
#define MATH_ERRNO 1
|
(seit C99) | |
|
#define MATH_ERREXCEPT 2
|
(seit C99) | |
|
#define math_errhandling /*implementierungsdefiniert*/
|
(seit C99) | |
Die Makrokonstante
math_errhandling
expandiert zu einem Ausdruck vom Typ
int
, der entweder gleich
MATH_ERRNO
, oder gleich
MATH_ERREXCEPT
, oder gleich deren bitweisen 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
|
zeigt an, dass Gleitkomma-Ausnahmen verwendet werden: mindestens
FE_DIVBYZERO
,
FE_INVALID
, und
FE_OVERFLOW
sind in
<fenv.h>
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 | acos ( 2 ) |
| Polstellenfehler | Das mathematische Ergebnis der Funktion ist exakt unendlich oder undefiniert | ERANGE | FE_DIVBYZERO | log ( 0.0 ) , 1.0 / 0.0 |
| Wertebereichsfehler durch Überlauf | Das mathematische Ergebnis ist endlich, wird aber nach dem Runden unendlich oder wird nach dem Abrunden zum größten darstellbaren endlichen Wert | ERANGE | FE_OVERFLOW | pow ( DBL_MAX , 2 ) |
| Wertebereichsfehler durch Unterlauf | Das Ergebnis ist ungleich Null, wird aber nach dem Runden 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) | sqrt ( 2 ) , 1.0 / 10.0 |
Inhaltsverzeichnis |
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. rint vs nearbyint ).
Vor C99 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 <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
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)
Siehe auch
|
Gleitkomma-Ausnahmen
(Makrokonstante) |
|
|
Makro, das zu einer POSIX-kompatiblen thread-lokalen Fehlernummer-Variable expandiert
(Makrovariable) |
|
|
C++-Dokumentation
für
math_errhandling
|
|