Namespaces
Variants

fegetenv, fesetenv

From cppreference.net
< c ‎ | numeric ‎ | fenv
Défini dans l'en-tête <fenv.h>
int fegetenv ( fenv_t * envp ) ;
(1) (depuis C99)
int fesetenv ( const fenv_t * envp ) ;
(2) (depuis C99)

1) Tente de stocker l'état de l'environnement en virgule flottante dans l'objet pointé par envp .

2) Tente d'établir l'environnement de virgule flottante à partir de l'objet pointé par envp . La valeur de cet objet doit avoir été préalablement obtenue par un appel à feholdexcept ou fegetenv ou être une constante macro de virgule flottante. Si des indicateurs d'état de virgule flottante sont positionnés dans envp , ils deviennent positionnés dans l'environnement (et peuvent ensuite être testés avec fetestexcept ), mais les exceptions de virgule flottante correspondantes ne sont pas déclenchées (l'exécution se poursuit sans interruption)

Table des matières

Paramètres

envp - pointeur vers l'objet de type fenv_t qui contient l'état de l'environnement en virgule flottante

Valeur de retour

0 en cas de succès, valeur non nulle sinon.

Exemple

#include <stdio.h>
#include <math.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
void show_fe_exceptions(void)
{
    printf("exceptions actuelles levées : ");
    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(" aucun");
    printf("\n");
}
void show_fe_rounding_method(void)
{
    printf("méthode d'arrondi actuelle:    ");
    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 ("inconnu");
    };
    printf("\n");
}
void show_fe_environment(void)
{
    show_fe_exceptions();
    show_fe_rounding_method();
}    
int main(void)
{
    fenv_t curr_env;
    int rtn;
    /* Afficher l'environnement par défaut. */
    show_fe_environment();
    printf("\n");
    /* Effectuer certains calculs dans l'environnement par défaut. */
    printf("+11.5 -> %+4.1f\n", rint(+11.5)); /* à mi-chemin entre deux entiers */
    printf("+12.5 -> %+4.1f\n", rint(+12.5)); /* à mi-chemin entre deux entiers */
    show_fe_environment();
    printf("\n");
    /* Sauvegarder l'environnement actuel. */
    rtn = fegetenv(&curr_env);
    /* Effectuer certains calculs avec la nouvelle méthode d'arrondi. */
    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");
    /* Restaurer l'environnement précédent. */
    rtn = fesetenv(&curr_env);
    show_fe_environment();
    return 0;
}

Sortie :

exceptions actuelles déclenchées : aucune
méthode d'arrondi actuelle :   FE_TONEAREST
+11.5 -> +12.0
+12.5 -> +12.0
exceptions actuelles déclenchées : FE_INEXACT
méthode d'arrondi actuelle :   FE_TONEAREST
1.0/0.0 = inf
+11.5 -> +11.0
+12.5 -> +12.0
exceptions actuelles déclenchées : FE_DIVBYZERO FE_INEXACT
méthode d'arrondi actuelle :   FE_DOWNWARD
exceptions actuelles déclenchées : FE_INEXACT
méthode d'arrondi actuelle :   FE_TONEAREST

Références

  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.6.4.1 La fonction fegetenv (p: 213)
  • 7.6.4.3 La fonction fesetenv (p: 214)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 7.6.4.1 La fonction fegetenv (p: 194)
  • 7.6.4.3 La fonction fesetenv (p: 195)

Voir aussi

sauvegarde l'environnement, efface tous les drapeaux d'état et ignore toutes les erreurs futures
(fonction)
restaure l'environnement en virgule flottante et déclenche les exceptions précédemment déclenchées
(fonction)
environnement en virgule flottante par défaut
(constante macro)
Documentation C++ pour fegetenv , fesetenv