FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
| Definiert in der Headerdatei <fenv.h> |
||
| #define FE_DIVBYZERO /*implementierungsdefinierte Zweierpotenz*/ |
(seit C99) | |
| #define FE_INEXACT /*implementierungsdefinierte Zweierpotenz*/ |
(seit C99) | |
| #define FE_INVALID /*implementierungsdefinierte Zweierpotenz*/ |
(seit C99) | |
| #define FE_OVERFLOW /*implementierungsdefinierte Zweierpotenz*/ |
(seit C99) | |
| #define FE_UNDERFLOW /*implementierungsdefinierte Zweierpotenz*/ |
(seit C99) | |
| #define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \ FE_INVALID | FE_OVERFLOW | \ |
(seit C99) | |
Alle diese Makrokonstanten (außer FE_ALL_EXCEPT) expandieren zu ganzzahligen konstanten Ausdrücken, die unterschiedliche Zweierpotenzen sind und alle unterstützten Gleitkomma-Ausnahmen eindeutig identifizieren. Jedes Makro ist nur dann definiert, wenn es unterstützt wird.
Die Makrokonstante FE_ALL_EXCEPT, die zur bitweisen ODER-Verknüpfung aller anderen FE_* expandiert, ist immer definiert und hat den Wert Null, wenn Gleitkomma-Ausnahmen von der Implementierung nicht unterstützt werden.
| Konstante | Erklärung |
FE_DIVBYZERO
|
Polfehler 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
|
Domänenfehler 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
|
Bitweise ODER aller unterstützten Gleitkomma-Ausnahmen |
Die Implementierung kann zusätzliche Makrokonstanten in <fenv.h> definieren, um zusätzliche Gleitkomma-Ausnahmen zu identifizieren. Alle solchen Konstanten beginnen mit FE_, gefolgt von mindestens einem Großbuchstaben.
Weitere Details finden Sie unter math_errhandling.
[bearbeiten] 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
[bearbeiten] Referenzen
- C11-Standard (ISO/IEC 9899:2011)
- 7.6/6 Floating-point environment <fenv.h> (S. 207)
- C99-Standard (ISO/IEC 9899:1999)
- 7.6/5 Floating-point environment <fenv.h> (S. 188)
[bearbeiten] Siehe auch
| (C99)(C99)(C99) |
definiert den von den allgemeinen mathematischen Funktionen verwendeten Fehlerbehandlungsmechanismus (Makrokonstante) |
| C++ Dokumentation für Makros für Gleitkomma-Ausnahmen
| |