| |||
| Home > Floating-point support > Exception trap handling by signals | |||
The following functionality requires you to select a floating-point
model that supports exceptions, such as --fpmode=ieee_full or --fpmode=ieee_fixed.
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 ISO function raise(). For example:
__rt_raise(SIGFPE, _FPE_INVALID);
__rt_raise() is declared in rt_misc.h.
ARM® C and C++ Libraries and Floating-Point Support Reference:
Compiler Reference: