HP-UX Floating-Point Guide

Chapter 5 137
Manipulating the Floating-Point Status Register
Run-Time Mode Control: The fenv(5) Suite
Sample Program: fe_traps.c
/*************************************************************/
#include <stdio.h>
#include <fenv.h>
#include <signal.h>
int traps;
fexcept_t flags;
/* trap handler for floating-point exceptions */
void handle_sigfpe(int sig)
{
void print_flags(int);
void print_traps(int);
printf("Raised signal %d -- floating point error\n", sig);
print_traps(traps);
print_flags(flags);
exit(-1);
}
int main(void)
{
void print_flags(int);
void print_traps(int);
struct sigaction act;
/* establish the trap handler */
act.sa_handler = &handle_sigfpe;
sigaction(SIGFPE, &act, NULL);
/* retrieve initial settings of flags and traps */
traps = fegettrapenable();
fegetexceptflag(&flags, FE_ALL_EXCEPT);
printf("at start:\n");
print_traps(traps);
print_flags(flags);
/* set a trap for the divide by zero exception */
fesettrapenable(FE_DIVBYZERO);
traps = fegettrapenable();
printf("after fesettrapenable(FE_DIVBYZERO):\n");
print_traps(traps);
/* raise divide by zero exception with trap enabled;
trap handler is called */
printf("raising division by zero exception now\n");
feraiseexcept(FE_DIVBYZERO);
} /* continued */
/*************************************************************/