/*
 *  float.h	Floating point functions
 *
 *  Copyright by WATCOM International Corp. 1988-1996.  All rights reserved.
 */
#ifndef _FLOAT_H_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif

/* macros for MS compatibility */
#ifndef _CRTAPI1
 #define _CRTAPI1
#endif
#ifndef _CRTAPI2
 #define _CRTAPI2
#endif
#ifndef _CRTIMP
 #define _CRTIMP
#endif

#define FLT_RADIX	2
#define FLT_ROUNDS	1	/* round to nearest */

/* number of base-FLT_RADIX digits in the floating point mantissa */
#define FLT_MANT_DIG	24
#define DBL_MANT_DIG	53
#define LDBL_MANT_DIG	53

/* number of decimal digits of precision */
#define FLT_DIG 	6
#define DBL_DIG 	15
#define LDBL_DIG	15

/* minimum negative integer such that FLT_RADIX raised to that power minus 1
 is a normalized floating point number */
#define FLT_MIN_EXP	(-127)
#define DBL_MIN_EXP	(-1023)
#define LDBL_MIN_EXP	(-1023)

/* minimum negative integer such that 10 raised to that power is in the
   range of normalized floating point numbers */
#define FLT_MIN_10_EXP	(-38)
#define DBL_MIN_10_EXP	(-307)
#define LDBL_MIN_10_EXP (-307)

/* maximum integer such that FLT_RADIX raised to that power minus 1 is a
   representable floating point number */
#define FLT_MAX_EXP	127
#define DBL_MAX_EXP	1023
#define LDBL_MAX_EXP	1023

/* maximum integer such that 10 raised to that power is in the range of
   representable floating point numbers */
#define FLT_MAX_10_EXP	38
#define DBL_MAX_10_EXP	308
#define LDBL_MAX_10_EXP 308

/* maximum representable floating point number */
#define FLT_MAX 	3.402823466e+38f
#define DBL_MAX 	1.79769313486231500e+308
#define LDBL_MAX	DBL_MAX

/* minimum positive floating point number x such that 1.0 + x != 1.0 */
#define FLT_EPSILON	1.192092896e-7f
#define DBL_EPSILON	2.22044604925031300e-016
#define LDBL_EPSILON	DBL_EPSILON

/* minimum representable positive floating point number */
#define FLT_MIN 	1.175494351e-38f
#define DBL_MIN 	2.22507385850720200e-308
#define LDBL_MIN	DBL_MIN

/*
 *  8087/80287/80387 math co-processor control information
 */

/* 80(x)87 Control Word Mask and bit definitions. */

#define _MCW_EM 	0x003f	/* Interrupt Exception Masks */
#define _EM_INVALID	0x0001	/*   invalid */
#define _EM_DENORMAL	0x0002	/*   denormal */
#define _EM_ZERODIVIDE	0x0004	/*   zero divide */
#define _EM_OVERFLOW	0x0008	/*   overflow */
#define _EM_UNDERFLOW	0x0010	/*   underflow */
#define _EM_INEXACT	0x0020	/*   inexact result - precision */

#define _MCW_IC 	0x1000	/* Infinity Control */
#define _IC_AFFINE	0x1000	/*   affine */
#define _IC_PROJECTIVE	0x0000	/*   projective */

#define _MCW_RC 	0x0c00	/* Rounding Control */
#define _RC_NEAR	0x0000	/*   near */
#define _RC_DOWN	0x0400	/*   down */
#define _RC_UP		0x0800	/*   up */
#define _RC_CHOP	0x0c00	/*   chop */

#define _MCW_PC 	0x0300	/* Precision Control */
#define _PC_24		0x0000	/*    24 bits */
#define _PC_53		0x0200	/*    53 bits */
#define _PC_64		0x0300	/*    64 bits */

/* initial Control Word value */

#define _CW_DEFAULT (_IC_AFFINE | _RC_NEAR | _PC_53 \
		    | _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE \
		    | _EM_OVERFLOW | _EM_UNDERFLOW | _EM_INEXACT)

/* 80(x)87 Status Word bit definitions */

#define _SW_INVALID	0x0001	/* invalid */
#define _SW_DENORMAL	0x0002	/* denormal */
#define _SW_ZERODIVIDE	0x0004	/* zero divide */
#define _SW_OVERFLOW	0x0008	/* overflow */
#define _SW_UNDERFLOW	0x0010	/* underflow */
#define _SW_INEXACT	0x0020	/* inexact (precision) */

/* the following are generated by software */

#define _SW_UNEMULATED	    0x0040  /* unemulated instruction */
/* invalid subconditions (_SW_INVALID also set) */
#define _SW_SQRTNEG	    0x0080  /* square root of a neg number */
#define _SW_STACKOVERFLOW   0x0200  /* FP stack overflow */
#define _SW_STACKUNDERFLOW  0x0400  /* FP stack underflow */

/* Floating-point error codes */

#define _FPE_INVALID		0x81
#define _FPE_DENORMAL		0x82
#define _FPE_ZERODIVIDE 	0x83
#define _FPE_OVERFLOW		0x84
#define _FPE_UNDERFLOW		0x85
#define _FPE_INEXACT		0x86

#define _FPE_UNEMULATED 	0x87
#define _FPE_SQRTNEG		0x88
#define _FPE_STACKOVERFLOW	0x8a
#define _FPE_STACKUNDERFLOW	0x8b
#define _FPE_EXPLICITGEN	0x8c
#define _FPE_IOVERFLOW		0x8d /* issued on fist(p) when value is too
					large to be represented as integer */
#define _FPE_LOGERR		0x8e
#define _FPE_MODERR		0x8f

#if !defined(NO_EXT_KEYS) /* extensions enabled */
/*
 *  8087/80287/80387 math co-processor control information
 */

/* 80(x)87 Control Word Mask and bit definitions. */

#define MCW_EM		_MCW_EM
#define EM_INVALID	_EM_INVALID
#define EM_DENORMAL	_EM_DENORMAL
#define EM_ZERODIVIDE	_EM_ZERODIVIDE
#define EM_OVERFLOW	_EM_OVERFLOW
#define EM_UNDERFLOW	_EM_UNDERFLOW
#define EM_INEXACT	_EM_INEXACT
#define EM_PRECISION	_EM_INEXACT	/* WATCOM's name */

#define MCW_IC		_MCW_IC
#define IC_AFFINE	_IC_AFFINE
#define IC_PROJECTIVE	_IC_PROJECTIVE

#define MCW_RC		_MCW_RC
#define RC_NEAR 	_RC_NEAR
#define RC_DOWN 	_RC_DOWN
#define RC_UP		_RC_UP
#define RC_CHOP 	_RC_CHOP

#define MCW_PC		_MCW_PC
#define PC_24		_PC_24
#define PC_53		_PC_53
#define PC_64		_PC_64

/* 80(x)87 Status Word bit definitions */

#define SW_INVALID	    _SW_INVALID
#define SW_DENORMAL	    _SW_DENORMAL
#define SW_ZERODIVIDE	    _SW_ZERODIVIDE
#define SW_OVERFLOW	    _SW_OVERFLOW
#define SW_UNDERFLOW	    _SW_UNDERFLOW
#define SW_INEXACT	    _SW_INEXACT
/* the following are generated by software */
#define SW_UNEMULATED	    _SW_UNEMULATED
#define SW_SQRTNEG	    _SW_SQRTNEG
#define SW_STACKOVERFLOW    _SW_STACKOVERFLOW
#define SW_STACKUNDERFLOW   _SW_STACKUNDERFLOW

/* Floating-point error codes */

#define FPE_INVALID	    _FPE_INVALID
#define FPE_DENORMAL	    _FPE_DENORMAL
#define FPE_ZERODIVIDE	    _FPE_ZERODIVIDE
#define FPE_OVERFLOW	    _FPE_OVERFLOW
#define FPE_UNDERFLOW	    _FPE_UNDERFLOW
#define FPE_INEXACT	    _FPE_INEXACT
#define FPE_UNEMULATED	    _FPE_UNEMULATED
#define FPE_SQRTNEG	    _FPE_SQRTNEG
#define FPE_STACKOVERFLOW   _FPE_STACKOVERFLOW
#define FPE_STACKUNDERFLOW  _FPE_STACKUNDERFLOW
#define FPE_EXPLICITGEN     _FPE_EXPLICITGEN
#define FPE_IOVERFLOW	    _FPE_IOVERFLOW
#define FPE_LOGERR	    _FPE_LOGERR
#define FPE_MODERR	    _FPE_MODERR

extern unsigned _clear87(void);
extern unsigned _control87(unsigned,unsigned);
extern void	_fpreset(void);
extern unsigned _status87(void);
#endif

#define _FLOAT_H_INCLUDED
#ifdef __cplusplus
};
#endif
#endif
