HP-UX Floating-Point Guide
Chapter 6 163
Floating-Point Trap Handling
Handling Traps
Sample Program: overflow_sig.c (Cont.)
/*************************************************************/
void print_flags(int flags)
{
if (flags & FE_INEXACT)
printf(" inexact result flag set\n");
if (flags & FE_UNDERFLOW)
printf(" underflow flag set\n");
if (flags & FE_OVERFLOW)
printf(" overflow flag set\n");
if (flags & FE_DIVBYZERO)
printf(" division by zero flag set\n");
if (flags & FE_INVALID)
printf(" invalid operation flag set\n");
if (!(flags & FE_ALL_EXCEPT))
printf(" no exception flags are set\n");
}
void print_traps(int traps)
{
if (traps & FE_INEXACT)
printf(" inexact result trap set\n");
if (traps & FE_UNDERFLOW)
printf(" underflow trap set\n");
if (traps & FE_OVERFLOW)
printf(" overflow trap set\n");
if (traps & FE_DIVBYZERO)
printf(" division by zero trap set\n");
if (traps & FE_INVALID)
printf(" invalid operation trap set\n");
if (!(traps & FE_ALL_EXCEPT))
printf(" no trap enables are set\n");
}
/*************************************************************/
If you compile and run this program, it produces a result like the
following:
$ cc overflow_sig.c -lm
$ ./a.out
overflow trap set
Raised signal 8 -- floating point error
code is 14
fr0L is 08000044
overflow trap set
inexact result flag set
The code 14 signifies an assist exception trap (see signal(5)), which
indicates a floating-point exception.
The main advantage of using a signal handler is that it eliminates the
core dump that you get without it if you compile with +FP or use
fesettrapenable.