/****************************************************************
*
*  fenv.h - floating-point environment access
*
*  February 2021
*  Stephen Heumann
*
****************************************************************/

#ifndef __fenv__
#define __fenv__

typedef unsigned short fenv_t;
typedef unsigned short fexcept_t;

/* Floating-point exceptions */
#define FE_INVALID    0x01
#define FE_UNDERFLOW  0x02
#define FE_OVERFLOW   0x04
#define FE_DIVBYZERO  0x08
#define FE_INEXACT    0x10
#define FE_ALL_EXCEPT 0x1F

/* Rounding directions */
#define FE_DOWNWARD   0x80
#define FE_TONEAREST  0x00
#define FE_TOWARDZERO 0xC0
#define FE_UPWARD     0x40

extern const fenv_t __FE_DFL_ENV[1];
#define FE_DFL_ENV (&*__FE_DFL_ENV)

int feclearexcept(int);
int fegetexceptflag(fexcept_t *, int);
int feraiseexcept(int);
int fesetexceptflag(const fexcept_t *, int);
int fetestexcept(int);
int fegetround(void);
int fesetround(int);
int fegetenv(fenv_t *);
int feholdexcept(fenv_t *);
int fesetenv(const fenv_t *);
int feupdateenv(const fenv_t *);

#endif
