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