fenv(3) Library Functions Manual fenv(3) NOM feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetes- texcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv, feenableexcept, fedisableexcept, fegetexcept - Gestion des exceptions et des arrondis des nombres flottants BIBLIOTHÈQUE Bibliothèque de math (libm, -lm) SYNOPSIS #include <fenv.h> int feclearexcept(int excepts); int fegetexceptflag(fexcept_t *flagp, int excepts); int feraiseexcept(int excepts); int fesetexceptflag(const fexcept_t *flagp, int excepts); int fetestexcept(int excepts); int fegetround(void); int fesetround(int rounding_mode); int fegetenv(fenv_t *envp); int feholdexcept(fenv_t *envp); int fesetenv(const fenv_t *envp); int feupdateenv(const fenv_t *envp); DESCRIPTION Ces onze fonctions ont été définies dans la norme C99, et décrivent la gestion des arrondis des nombres flottants et des exceptions (dépasse- ment, division par zéro, etc.) sur les nombres flottants. Exceptions L'exception divide-by-zero (division par zéro) se produit quand une opération sur des nombres finis donne un résultat infini. L'exception overflow (dépassement) se produit quand un résultat doit être représenté par un nombre flottant, mais que sa valeur absolue est trop grande pour être représentée par un nombre flottant. L'exception underflow (soupassement) se produit quand un résultat doit être représenté par un nombre flottant, mais que sa valeur absolue est trop petite pour être représentée en nombre flottant. L'exception inexact se produit quand le résultat arrondi d'une opéra- tion n'est pas égal au résultat en précision infinie. Elle peut se dé- clencher quand les exceptions overflow ou underflow se produisent. L'exception invalid se produit quand il n'y a pas de résultat bien dé- fini pour une opération, comme « 0/0 » ou « infini-infini » ou « sqrt(-1) ». Gestion des exceptions Les exceptions sont représentées de deux manières : en tant qu'un unique bit (exception présente ou absente), et ces bits correspondent, de manière dépendant de l'implémentation, avec une position au sein d'un entier, et aussi en tant que structure opaque pouvant contenir plus d'informations concernant l'exception (éventuellement l'adresse du code déclenchant l'erreur). Chacune des macros FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW est définie lorsque l'implémentation gère l'exception cor- respondante. Les bits sont alors définis, ainsi on peut appeler, par exemple, les fonctions de gestion des exceptions avec un argument en- tier FE_OVERFLOW|FE_UNDERFLOW. D'autres exceptions peuvent être suppor- tées. La macro FE_ALL_EXCEPT est un masque au format OU binaire corres- pondant à toutes les exceptions supportées. La fonction feclearexcept() efface les exceptions supportées représen- tées par les bits de son argument. La fonction fegetexceptflag() stocke une représentation de l'état des exceptions contenues dans son argument excepts dans l'objet opaque *flagp. La fonction feraiseexcept() déclenche les exceptions supportées, repré- sentées par les bits de son argument excepts. La fonction fesetexceptflag() définit l'état des exceptions représen- tées par l'argument excepts à la valeur *flagp. Cette valeur doit être le résultat d'un appel préalable à fegetexceptflag() avec un dernier argument contenant tous les bits dans excepts. La fonction fetestexcept() renvoie un mot dont les bits définis sont également les bits définis dans l'argument excepts et pour lesquels l'exception correspondante est définie. Mode d'arrondis Le mode d'arrondi détermine comment le résultat des opérations en vir- gule flottante doit être traité quand le résultat ne peut pas être re- présenté exactement dans la mantisse. Plusieurs modes d'arrondis peuvent être fournis : arrondi au plus proche (le mode par défaut), ar- rondi vers le haut (vers l'infini positif), arrondi vers le bas (vers l'infini négatif) et l'arrondi vers zéro. Chacune des macros FE_TONEAREST, FE_UPWARD, FE_DOWNWARD et FE_TOWARD- ZERO est définie lorsque l'implémentation gère la définition et la lec- ture de la direction d'arrondi correspondante. La fonction fegetround() renvoie la macro correspondant au mode d'ar- rondi en cours. La fonction fesetround() définit le mode d'arrondi tel qu'il est spéci- fié par son argument et renvoie zéro en cas de succès. C99 et POSIX.1-2008 spécifient un identifiant, FLT_ROUNDS, défini dans <float.h>, qui indique le mode d'arrondi de l'implémentation pour les additions en virgule flottante. Cet identifiant peut prendre une des valeurs suivantes : -1 Le mode d'arrondi est indéterminé. 0 L'arrondi se fait vers 0. 1 L'arrondi se fait vers le nombre le plus proche. 2 L'arrondi se fait vers l'infini positif. 3 L'arrondi se fait vers l'infini négatif. Les autres valeurs sont dépendantes des machines, et ne sont pas des modes d'arrondi standard. La valeur de FLT_ROUNDS devrait refléter le mode d'arrondi en cours tel qu'il est configuré par fesetround() (mais consultez la section des BOGUES). Environnement de virgule flottante L'environnement de virgule flottante, y compris les modes de contrôle et les drapeaux d'état, peuvent être manipulés sous forme d'un objet opaque de type fenv_t. L'environnement par défaut est représenté par FE_DFL_ENV (de type const fenv_t *). Il s'agit de la configuration de l'environnement au démarrage d'un programme, et elle est définie par ISO C comme ayant un arrondi au plus proche, toutes les exceptions ef- facées et un mode sans arrêt (continuer en présence des exceptions). La fonction fegetenv() sauve l'environnement de travail en cours en virgule flottante dans l'objet *envp. La fonction feholdexcept() effectue la même chose, puis efface tous les drapeaux d'exceptions, et bascule si possible sur un mode sans arrêt (continuer en présence des exceptions). Elle renvoie zéro en cas de succès. La fonction fesetenv() recharge l'environnement de travail en virgule flottante à partir de l'objet *envp. Cet objet doit être valide, c'est-à-dire être le résultat d'un appel à fegetenv() ou feholdex- cept(), ou égal à FE_DFL_ENV. Cet appel ne déclenche pas d'exception. La fonction feupdateenv() installe l'environnement de virgule flottante représenté par l'objet *envp, sauf que les exceptions déjà déclenchées ne sont pas effacées. Après l'appel de cette fonction, les exceptions déclenchées seront un OU binaire entre l'ensemble précédent, et celui contenu dans *envp. Comme précédemment, l'objet *envp doit être va- lide. VALEUR RENVOYÉE Ces fonctions renvoient 0 en cas de succès et une valeur non nulle en cas d'erreur. VERSIONS Ces fonctions ont été ajoutées dans la glibc 2.1. ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter attributes(7). ┌─────────────────────────────────────┬──────────────────────┬─────────┐ │Interface │ Attribut │ Valeur │ ├─────────────────────────────────────┼──────────────────────┼─────────┤ │feclearexcept(), fegetexceptflag(), │ Sécurité des threads │ MT-Safe │ │feraiseexcept(), fesetexceptflag(), │ │ │ │fetestexcept(), fegetround(), │ │ │ │fesetround(), fegetenv(), │ │ │ │feholdexcept(), fesetenv(), │ │ │ │feupdateenv(), feenableexcept(), │ │ │ │fedisableexcept(), fegetexcept() │ │ │ └─────────────────────────────────────┴──────────────────────┴─────────┘ STANDARDS IEC 60559 (IEC 559:1989), ANSI/IEEE 854, C99, POSIX.1-2001. NOTES Notes de la glibc Si possible, la bibliothèque GNU C définit une macro FE_NOMASK_ENV qui représente un environnement où toutes les exceptions déclenchées en- traînent une interception. La présence de cette macro peut être testée en utilisant #ifdef. Elle n'est définie que si _GNU_SOURCE est définie. Le standard C99 ne définit pas de méthode pour positionner les bits in- dividuels dans le masque de virgule flottante, par exemple pour inter- cepter des drapeaux particuliers. Depuis la glibc 2.2, la glibc gère feenableexcept() et fedisableexcept() pour définir individuellement des interceptions de virgules flottantes, et fegetexcept() pour demander l'état. #define _GNU_SOURCE /* Voir feature_test_macros(7) */ #include <fenv.h> int feenableexcept(int excepts); int fedisableexcept(int excepts); int fegetexcept(void); Les fonctions feenableexcept() et fedisableexcept() activent (désac- tivent) les interceptions pour chaque exception représentée par excepts et renvoient l'ensemble précédent des exceptions activées lorsqu'elles réussissent, et -1 sinon. La fonction fegetexcept() renvoie l'ensemble des exceptions actuellement activées. BOGUES C99 spécifie que la valeur de FLT_ROUNDS devrait refléter les change- ments du mode d'arrondi en cours, tels qu'il est configuré par fese- tround(). Actuellement, ce n'est pas le cas : FLT_ROUNDS prend toujours la valeur 1. VOIR AUSSI math_error(7) TRADUCTION La traduction française de cette page de manuel a été créée par Chris- tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste- phan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, Fran- çois Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Gué- rard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.cou- lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centra- liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <si- mon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@de- bian.org>, David Prévot <david@tilapin.org> et Cédric Boutillier <ce- dric.boutillier@gmail.com> Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à ⟨debian-l10n-french@lists.debian.org⟩. Pages du manuel de Linux 6.03 5 février 2023 fenv(3)
Generated by dwww version 1.15 on Sat Jun 29 00:26:19 CEST 2024.