Datasheet
Floating-point Support
ARM DUI 0067D Copyright © 1999-2001 ARM Limited. All rights reserved. 5-15
The exception macros are bit fields. The macro
FE_ALL_EXCEPT
is the bitwise OR of all
of them.
Handling exception flags
C9X provides three functions to clear, test and raise exceptions:
void feclearexcept(int excepts);
int fetestexcept(int excepts);
void feraiseexcept(int excepts);
The
feclearexcept
function clears the sticky flags for the given exceptions. The
fetestexcept
function returns the bitwise OR of the sticky flags for the given exceptions
(so that if the Overflow flag was set but the Underflow flag was not, then calling
fetestexcept(FE_OVERFLOW|FE_UNDERFLOW)
would return
FE_OVERFLOW
).
The
feraiseexcept
function raises the given exceptions, in unspecified order. If an
exception trap is enabled for an exception raised this way, it is called.
C9X also provides functions to save and restore everything about a given exception.
This includes the sticky flag, whether the exception is trapped, and the address of the
trap handler, if any. These functions are:
void fegetexceptflag(fexcept_t *flagp, int excepts);
void fesetexceptflag(const fexcept_t *flagp, int excepts);
The
fegetexceptflag
function copies all the information relating to the given exceptions
into the
fexcept_t
variable provided. The
fesetexceptflag
function copies all the
information relating to the given exceptions from the
fexcept_t
variable into the current
floating-point environment.
Note
fesetexceptflag
can be used to set the sticky flag of a trapped exception to 1 without
calling the trap handler, whereas
feraiseexcept
calls the trap handler for any trapped
exception.
Handling rounding modes
C9X provides two functions for controlling rounding modes:
int fegetround(void);
int fesetround(int round);