B.5 <fenv.h> (C99) 

In der Headerdatei <fenv.h> finden Sie verschiedene Einstellungen für das Rechnen mit Gleitpunktzahlen, um mit Gleitpunkt-Exceptions und Zustandsflags zu arbeiten. Außerdem können Sie hierbei auch das Rundungsverhalten von Gleitpunkt-Arithmetiken einstellen.
Um mit dem Programm auf diese Gleitpunkt-Umgebung zuzugreifen, empfiehlt es sich, dies dem Compiler mit dem Pragma STDC FENV_ACCESS mitzuteilen:
// Compiler-Optimierungen verhindern #pragma STDC FENV_ACCESS ON
Mit OFF können Sie das Pragma wieder abschalten. Ob dieses Pragma mit dem Status ON oder OFF implementiert ist, hängt vom Compiler ab. Das Pragma ist ebenfalls in der Headerdatei <fenv.h> definiert.
Für den Zugriff auf die komplette Gleitpunkt-Umgebung stehen folgende typedef-Typen zur Verfügung:
Typ | Beschreibung |
fenv_t |
Der Typ stellt die Gleitpunkt-Umgebung als Ganzes dar. |
fexcept_t |
Der Typ stellt die Zustandsflags und Gleitpunkt-Exceptions als Ganzes dar. |
Zugriff auf die komplette Gleitpunkt-Umgebung mit dem Typ fenv_t haben Sie mit folgenden Funktionen:
Funktion | Beschreibung |
int fegetenv(fenv_t *envp); |
Gleitpunkt-Umgebung speichern |
int feholdexcept( fenv_t *envp ); |
Gleitpunkt-Umgebung in einen Non-Stop-Modus setzen. Hierbei unterbricht eine Exception nicht die Programmausführung. |
int fesetenv( const fenv_t *envp ); |
Gleitpunktumgebung wiederherstellen |
int feupdateenv( const fenv_t *envp ); |
eine gespeicherte Gleitpunkt-Umgebung wiederherstellen und alle zur Laufzeit gesetzten Exceptions erneut auslösen |
Für den Zugriff auf die Gleitpunkt-Exception und Zustandsflags stehen Ihnen folgende Funktionen zur Verfügung:
Funktion | Beschreibung |
int feclearexcept (int excepts); |
Exception wieder löschen |
int fegetexceptflag ( fexcept_t *flagp, int excepts); |
Exception-Statusflags speichern |
int feraiseexcept (int excepts); |
Exception manuell auslösen |
int fesetexceptflag ( const fexcept_t *flagp, int excepts); |
Exception-Statusflags wiederherstellen |
int fetestexcept (int excepts); |
Exception-Statusflags testen |
Zur genauen Identifizierung der Exeception- und Zustandsflags sind in der Headerdatei <fenv.h> folgende ganzzahlige Makros definiert:
Makro | Beschreibung |
FE_DIVBYZERO |
Division durch null |
FE_INEXACT |
Ungenauigkeit bei der Gleitpunktberechnung |
FE_INVALID |
Ungültige Gleitpunktberechnung |
FE_OVERFLOW |
Überlauf bei der Gleitpunktberechnung |
FE_UNDERFLOW |
Unterlauf bei der Gleitpunktberechnung |
FE_ALL_EXCEPT |
Zugriff auf alle unterstützten Exceptions |
Ebenfalls in der Headerdatei <fenv.h> sind Funktionen definiert, um das Rundungsverhalten der Gleitpunkt-Arithmetik einzustellen:
Funktion | Beschreibung |
int fegetround (void); |
Gibt den aktuellen Rundungsmodus zurück (gewöhnlich ist hier FE_TONEAREST eingestellt). |
int fesetround (int round); |
Setzt den Rundungsmodus auf round. |
Folgende Makros sind hier in der Headerdatei <fenv.h> definiert, um den Rundungsmodus abzufragen bzw. zu setzen:
Makro | Beschreibung |
FE_DOWNWARD |
Gleitpunktzahl zum nächsten Integer abrunden |
FE_UPWARD |
Gleitpunktzahl zum nächsten Integer aufrunden |
FE_TONEAREST |
Gleitpunktzahl auf nächstnäheren Integer auf- oder abrunden (Standardeinstellung) |
FE_TOWARDZERO |
Gleitpunktzahl auf den nächstmöglichen Integer in der Nähe von 0 runden |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.