Datasheet

Floating-point Support
5-22 Copyright © 1999-2001 ARM Limited. All rights reserved. ARM DUI 0067D
/* For all other invalid operations, raise SIGFPE as usual */
raise(SIGFPE);
}
Install the handler function as follows:
fenv_t env;
fegetenv(&env);
env.statusword |= FE_IEEE_MASK_INVALID;
env.invalid_handler = myhandler;
fesetenv(&env);
After the handler is installed, dividing 0.0 by 0.0 returns 1.0.
Exception trap handling by signals
If an exception is trapped but the trap handler address is set to
NULL
, a default trap
handler is used.
The default trap handler raises a
SIGFPE
signal. The default handler for
SIGFPE
prints an
error message and terminates the program.
If you trap
SIGFPE
, you can declare your signal handler function to have a second
parameter that tells you the type of floating-point exception that occurred. This feature
is provided for compatibility with Microsoft products. The values are
_FPE_INVALID
,
_FPE_ZERODIVIDE
,
_FPE_OVERFLOW
,
_FPE_UNDERFLOW
and
_FPE_INEXACT
. They are defined in
float.h
. For example:
void sigfpe(int sig, int etype) {
printf("SIGFPE (%s)\n",
etype == _FPE_INVALID ? "Invalid Operation" :
etype == _FPE_ZERODIVIDE ? "Divide by Zero" :
etype == _FPE_OVERFLOW ? "Overflow" :
etype == _FPE_UNDERFLOW ? "Underflow" :
etype == _FPE_INEXACT ? "Inexact Result" :
"Unknown");
}
signal(SIGFPE, (void(*)(int))sigfpe);
To generate your own
SIGFPE
signals with this extra information, you can call the
function
__rt_raise
instead of the ANSI function raise. In Example 5-1 on page 5-21,
instead of:
raise(SIGFPE);
it is better to code:
__rt_raise(SIGFPE, _FPE_INVALID);