FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
|
Definiert im Header
<fenv.h>
|
||
|
#define FE_DIVBYZERO /*implementation defined power of 2*/
|
(seit C99) | |
|
#define FE_INEXACT /*implementation defined power of 2*/
|
(seit C99) | |
|
#define FE_INVALID /*implementation defined power of 2*/
|
(seit C99) | |
|
#define FE_OVERFLOW /*implementation defined power of 2*/
|
(seit C99) | |
|
#define FE_UNDERFLOW /*implementation defined power of 2*/
|
(seit C99) | |
|
#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \
FE_INVALID | FE_OVERFLOW | \
|
(seit C99) | |
Alle diese Makrokonstanten (außer FE_ALL_EXCEPT ) erweitern zu ganzzahligen Konstantenausdrücken, die unterschiedliche Zweierpotenzen sind und alle unterstützten Gleitkomma-Ausnahmen eindeutig identifizieren. Jedes Makro ist nur definiert, wenn es unterstützt wird.
Die Makrokonstante
FE_ALL_EXCEPT
, die sich zur bitweisen ODER-Verknüpfung aller anderen
FE_*
-Konstanten expandiert, ist immer definiert und ist null, wenn die Implementierung keine Gleitkomma-Ausnahmen unterstützt.
| Konstante | Erklärung |
FE_DIVBYZERO
|
Polstellenfehler trat bei einer früheren Gleitkommaoperation auf |
FE_INEXACT
|
Ungenaues Ergebnis: Rundung war notwendig, um das Ergebnis einer früheren Gleitkommaoperation zu speichern |
FE_INVALID
|
Definitionsbereichsfehler trat bei einer früheren Gleitkommaoperation auf |
FE_OVERFLOW
|
Das Ergebnis einer früheren Gleitkommaoperation war zu groß, um darstellbar zu sein |
FE_UNDERFLOW
|
Das Ergebnis einer früheren Gleitkommaoperation war subnormal mit Genauigkeitsverlust |
FE_ALL_EXCEPT
|
Bitweises ODER aller unterstützten Gleitkomma-Ausnahmen |
Die Implementierung kann zusätzliche Makrokonstanten in
<fenv.h>
definieren, um zusätzliche Gleitkomma-Ausnahmen zu identifizieren. Alle diese Konstanten beginnen mit
FE_
gefolgt von mindestens einem Großbuchstaben.
Siehe math_errhandling für weitere Details.
Beispiel
#include <stdio.h> #include <math.h> #include <float.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void) { printf("exceptions raised:"); if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO"); if(fetestexcept(FE_INEXACT)) printf(" FE_INEXACT"); if(fetestexcept(FE_INVALID)) printf(" FE_INVALID"); if(fetestexcept(FE_OVERFLOW)) printf(" FE_OVERFLOW"); if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW"); feclearexcept(FE_ALL_EXCEPT); printf("\n"); } int main(void) { printf("MATH_ERREXCEPT is %s\n", math_errhandling & MATH_ERREXCEPT ? "set" : "not set"); printf("0.0/0.0 = %f\n", 0.0/0.0); show_fe_exceptions(); printf("1.0/0.0 = %f\n", 1.0/0.0); show_fe_exceptions(); printf("1.0/10.0 = %f\n", 1.0/10.0); show_fe_exceptions(); printf("sqrt(-1) = %f\n", sqrt(-1)); show_fe_exceptions(); printf("DBL_MAX*2.0 = %f\n", DBL_MAX*2.0); show_fe_exceptions(); printf("nextafter(DBL_MIN/pow(2.0,52),0.0) = %.1f\n", nextafter(DBL_MIN/pow(2.0,52),0.0)); show_fe_exceptions(); }
Mögliche Ausgabe:
MATH_ERREXCEPT is set 0.0/0.0 = nan exceptions raised: FE_INVALID 1.0/0.0 = inf exceptions raised: FE_DIVBYZERO 1.0/10.0 = 0.100000 exceptions raised: FE_INEXACT sqrt(-1) = -nan exceptions raised: FE_INVALID DBL_MAX*2.0 = inf exceptions raised: FE_INEXACT FE_OVERFLOW nextafter(DBL_MIN/pow(2.0,52),0.0) = 0.0 exceptions raised: FE_INEXACT FE_UNDERFLOW
Referenzen
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.6/6 Gleitkomma-Umgebung <fenv.h> (S. 207)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.6/5 Gleitkomma-Umgebung <fenv.h> (S. 188)
Siehe auch
|
(C99)
(C99)
(C99)
|
definiert den Fehlerbehandlungsmechanismus, der von den allgemeinen mathematischen Funktionen verwendet wird
(Makrokonstante) |
|
C++-Dokumentation
für
Gleitkomma-Ausnahmemakros
|
|