fenv.h

TriggerTek Logo
abcdefghijklmnopqrstuvwxyz_
<fenv.h>(P)							  <fenv.h>(P)



NAME
       fenv.h - floating-point environment

SYNOPSIS
       #include <fenv.h>

DESCRIPTION
       The  <fenv.h>  header  shall  define  the following data types through
       typedef:

       fenv_t Represents the entire floating-point environment. The floating-
	      point  environment  refers  collectively	to any floating-point
	      status flags and control modes supported by the implementation.

       fexcept_t
	      Represents   the	 floating-point	 status	 flags	collectively,
	      including any status the	implementation	associates  with  the
	      flags.  A floating-point status flag is a system variable whose
	      value is set (but never cleared) when a  floating-point  excep-
	      tion  is	raised,	 which occurs as a side effect of exceptional
	      floating-point arithmetic to provide auxiliary  information.  A
	      floating-point  control  mode  is a system variable whose value
	      may be set by the user to affect	the  subsequent	 behavior  of
	      floating-point arithmetic.


       The  <fenv.h>  header shall define the following constants if and only
       if the implementation supports the floating-point exception  by	means
       of  the	floating-point	functions feclearexcept(), fegetexceptflag(),
       feraiseexcept(), fesetexceptflag(), and fetestexcept().	Each  expands
       to an integer constant expression with values such that bitwise-inclu-
       sive ORs of all combinations of the constants result in distinct	 val-
       ues.


	      FE_DIVBYZERO
	      FE_INEXACT
	      FE_INVALID
	      FE_OVERFLOW
	      FE_UNDERFLOW

       The <fenv.h> header shall define the following constant, which is sim-
       ply the bitwise-inclusive OR of all floating-point exception constants
       defined above:


	      FE_ALL_EXCEPT

       The  <fenv.h>  header shall define the following constants if and only
       if the implementation supports getting  and  setting  the  represented
       rounding direction by means of the fegetround() and fesetround() func-
       tions. Each expands to an integer constant expression whose values are
       distinct non-negative vales.


	      FE_DOWNWARD
	      FE_TONEAREST
	      FE_TOWARDZERO
	      FE_UPWARD

       The  <fenv.h> header shall define the following constant, which repre-
       sents  the  default  floating-point  environment	 (that	is,  the  one
       installed  at program startup) and has type pointer to const-qualified
       fenv_t. It can be used as an argument  to  the  functions  within  the
       <fenv.h> header that manage the floating-point environment.


	      FE_DFL_ENV

       The  following  shall be declared as functions and may also be defined
       as macros. Function prototypes shall be provided.


	      int  feclearexcept(int);
	      int  fegetexceptflag(fexcept_t *, int);
	      int  feraiseexcept(int);
	      int  fesetexceptflag(const fexcept_t *, int);
	      int  fetestexcept(int);
	      int  fegetround(void);
	      int  fesetround(int);
	      int  fegetenv(fenv_t *);
	      int  feholdexcept(fenv_t *);
	      int  fesetenv(const fenv_t *);
	      int  feupdateenv(const fenv_t *);

       The FENV_ACCESS pragma provides a means to inform  the  implementation
       when  an	 application  might  access the floating-point environment to
       test floating-point status flags or run	under  non-default  floating-
       point  control  modes.  The pragma shall occur either outside external
       declarations or preceding all  explicit	declarations  and  statements
       inside  a  compound statement. When outside external declarations, the
       pragma takes effect from	 its  occurrence  until	 another  FENV_ACCESS
       pragma  is encountered, or until the end of the translation unit. When
       inside a compound statement, the pragma takes effect from  its  occur-
       rence  until  another  FENV_ACCESS  pragma  is  encountered (including
       within a nested compound statement), or until the end of the  compound
       statement; at the end of a compound statement the state for the pragma
       is restored to its condition just before the  compound  statement.  If
       this  pragma  is used in any other context, the behavior is undefined.
       If part of an application  tests	 floating-point	 status	 flags,	 sets
       floating-point control modes, or runs under non-default mode settings,
       but was translated with the state for the FENV_ACCESS pragma off,  the
       behavior is undefined. The default state (on or off) for the pragma is
       implementation-defined. (When execution passes  from  a	part  of  the
       application  translated with FENV_ACCESS off to a part translated with
       FENV_ACCESS on, the  state  of  the  floating-point  status  flags  is
       unspecified  and	 the  floating-point control modes have their default
       settings.)

       The following sections are informative.

APPLICATION USAGE
       This header is designed to support the floating-point exception status
       flags   and   directed-rounding	 control   modes   required   by  the
       IEC 60559:1989 standard, and other similar floating-point state infor-
       mation.	 Also it is designed to facilitate code portability among all
       systems.

       Certain application programming conventions support the intended model
       of use for the floating-point environment:

	* A  function call does not alter its caller’s floating-point control
	  modes, clear its caller’s floating-point status flags,  nor  depend
	  on the state of its caller’s floating-point status flags unless the
	  function is so documented.


	* A function call is assumed to require default	 floating-point	 con-
	  trol modes, unless its documentation promises otherwise.


	* A function call is assumed to have the potential for raising float-
	  ing-point exceptions, unless its documentation promises  otherwise.


       With  these  conventions,  an  application  can	safely assume default
       floating-point control modes (or be unaware of them). The responsibil-
       ities associated with accessing the floating-point environment fall on
       the application that does so explicitly.

       Even though the rounding direction macros may expand to constants cor-
       responding  to  the  values of FLT_ROUNDS, they are not required to do
       so.

       For example:


	      #include <fenv.h>
	      void f(double x)
	      {
		  #pragma STDC FENV_ACCESS ON
		  void g(double);
		  void h(double);
		  /* ... */
		  g(x + 1);
		  h(x + 1);
		  /* ... */
	      }

       If the function g() might depend on status flags set as a side  effect
       of  the	first x+1, or if the second x+1 might depend on control modes
       set as a side effect of the call to function g(), then the application
       shall contain an appropriately placed invocation as follows:


	      #pragma STDC FENV_ACCESS ON

RATIONALE
   The fexcept_t Type
       fexcept_t  does	not  have  to  be an integer type. Its values must be
       obtained by a call to fegetexceptflag(), and cannot be created by log-
       ical  operations	 from  the  exception macros. An implementation might
       simply implement fexcept_t as  an  int  and  use	 the  representations
       reflected  by the exception macros, but is not required to; other rep-
       resentations might contain extra	 information  about  the  exceptions.
       fexcept_t  might	 be  a	struct with a member for each exception (that
       might hold the address of the first or last floating-point instruction
       that  caused  that exception). The ISO/IEC 9899:1999 standard makes no
       claims about the internals of an fexcept_t, and	so  the	 user  cannot
       inspect it.

   Exception and Rounding Macros
       Macros  corresponding to unsupported modes and rounding directions are
       not defined by the implementation and  must  not	 be  defined  by  the
       application. An application might use #ifdef to test for this.

FUTURE DIRECTIONS
       None.

SEE ALSO
       The System Interfaces volume of IEEE Std 1003.1-2001, feclearexcept(),
       fegetenv(), fegetexceptflag(), fegetround(), feholdexcept(),  feraise-
       except(), fesetenv(), fesetexceptflag(), fesetround(), fetestexcept(),
       feupdateenv()

COPYRIGHT
       Portions of this text are reprinted and reproduced in electronic	 form
       from   IEEE   Std  1003.1,  2003	 Edition,  Standard  for  Information
       Technology -- Portable Operating System Interface  (POSIX),  The	 Open
       Group  Base  Specifications  Issue  6,  Copyright (C) 2001-2003 by the
       Institute of Electrical and Electronics Engineers, Inc  and  The	 Open
       Group.  In  the	event of any discrepancy between this version and the
       original IEEE and The Open Group Standard, the original IEEE  and  The
       Open Group Standard is the referee document. The original Standard can
       be obtained online at http://www.opengroup.org/unix/online.html .



POSIX				     2003			  <fenv.h>(P)