Namespaces
Variants

fegetenv, fesetenv

From cppreference.net
< c ‎ | numeric ‎ | fenv
Definiert im Header <fenv.h>
int fegetenv ( fenv_t * envp ) ;
(1) (seit C99)
int fesetenv ( const fenv_t * envp ) ;
(2) (seit C99)

1) Versucht, den Status der Gleitkommaumgebung in dem Objekt zu speichern, auf das envp zeigt.

2) Versucht, die Gleitkommaumgebung aus dem Objekt einzurichten, auf das envp zeigt. Der Wert dieses Objekts muss zuvor durch einen Aufruf von feholdexcept oder fegetenv erhalten worden sein oder eine Gleitkomma-Makrokonstante sein. Falls irgendwelche Gleitkomma-Statusflags in envp gesetzt sind, werden sie in der Umgebung gesetzt (und können dann mit fetestexcept getestet werden), aber die entsprechenden Gleitkomma-Ausnahmen werden nicht ausgelöst (die Ausführung wird ununterbrochen fortgesetzt).

Inhaltsverzeichnis

Parameter

envp - Zeiger auf das Objekt vom Typ fenv_t , das den Status der Gleitkommaumgebung enthält

Rückgabewert

0 bei Erfolg, andernfalls ungleich Null.

Beispiel

#include <stdio.h>
#include <math.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
void show_fe_exceptions(void)
{
    printf("aktuelle ausgelöste Ausnahmen: ");
    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");
    if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none");
    printf("\n");
}
void show_fe_rounding_method(void)
{
    printf("aktuelle Rundungsmethode:    ");
    switch (fegetround()) {
           case FE_TONEAREST:  printf ("FE_TONEAREST");  break;
           case FE_DOWNWARD:   printf ("FE_DOWNWARD");   break;
           case FE_UPWARD:     printf ("FE_UPWARD");     break;
           case FE_TOWARDZERO: printf ("FE_TOWARDZERO"); break;
           default:            printf ("unbekannt");
    };
    printf("\n");
}
void show_fe_environment(void)
{
    show_fe_exceptions();
    show_fe_rounding_method();
}    
int main(void)
{
    fenv_t curr_env;
    int rtn;
    /* Standardumgebung anzeigen. */
    show_fe_environment();
    printf("\n");
    /* Führe einige Berechnungen unter Standardumgebung durch. */
    printf("+11.5 -> %+4.1f\n", rint(+11.5)); /* genau zwischen zwei ganzen Zahlen */
    printf("+12.5 -> %+4.1f\n", rint(+12.5)); /* genau zwischen zwei ganzen Zahlen */
    show_fe_environment();
    printf("\n");
    /* Aktuelle Umgebung speichern. */
    rtn = fegetenv(&curr_env);
    /* Führe einige Berechnungen mit neuer Rundungsmethode durch. */
    feclearexcept(FE_ALL_EXCEPT);
    fesetround(FE_DOWNWARD);
    printf("1.0/0.0 = %f\n", 1.0/0.0);
    printf("+11.5 -> %+4.1f\n", rint(+11.5));
    printf("+12.5 -> %+4.1f\n", rint(+12.5));
    show_fe_environment();
    printf("\n");
    /* Vorherige Umgebung wiederherstellen. */
    rtn = fesetenv(&curr_env);
    show_fe_environment();
    return 0;
}

Ausgabe:

aktuelle ausgelöste Ausnahmen: keine
aktuelle Rundungsmethode:   FE_TONEAREST
+11.5 -> +12.0
+12.5 -> +12.0
aktuelle ausgelöste Ausnahmen: FE_INEXACT
aktuelle Rundungsmethode:   FE_TONEAREST
1.0/0.0 = inf
+11.5 -> +11.0
+12.5 -> +12.0
aktuelle ausgelöste Ausnahmen: FE_DIVBYZERO FE_INEXACT
aktuelle Rundungsmethode:   FE_DOWNWARD
aktuelle ausgelöste Ausnahmen: FE_INEXACT
aktuelle Rundungsmethode:   FE_TONEAREST

Referenzen

  • C11-Standard (ISO/IEC 9899:2011):
  • 7.6.4.1 Die fegetenv-Funktion (S. 213)
  • 7.6.4.3 Die fesetenv-Funktion (S. 214)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.6.4.1 Die fegetenv-Funktion (S. 194)
  • 7.6.4.3 Die fesetenv-Funktion (S. 195)

Siehe auch

Speichert die Umgebung, löscht alle Statusflags und ignoriert alle zukünftigen Fehler
(Funktion)
Stellt die Gleitkommaumgebung wieder her und löst die zuvor ausgelösten Ausnahmen aus
(Funktion)
Standard-Gleitkommaumgebung
(Makrokonstante)
C++-Dokumentation für fegetenv , fesetenv