/** * * Structure to hold information about math exceptions * */ struct exception { int type; /* error type */ char *name; /* math function name */ double arg1, arg2; /* function arguments */ double retval; /* proposed return value */ }; /* * * Exception type codes, found in exception.type * */ #define DOMAIN 1 /* domain error */ #define SING 2 /* singularity */ #define OVERFLOW 3 /* overflow */ #define UNDERFLOW 4 /* underflow */ #define TLOSS 5 /* total loss of significance */ #define PLOSS 6 /* partial loss of significance */ /** * * Error codes generated by basic arithmetic operations (+ - * /) * */ #define FPEUND 1 /* underflow */ #define FPEOVF 2 /* overflow */ #define FPEZDV 3 /* zero divisor */ #define FPENAN 4 /* not a number (invalid operation) */ #define FPECOM 5 /* not comparable */ /** * * Constants * */ #define PI 3.14159265358979323846 #define PID2 1.57079632679489661923 /* PI divided by 2 */ #define PID4 0.78539816339744830962 /* PI divided by 4 */ #define I_PI 0.31830988618379067154 /* Inverse of PI */ #define I_PID2 0.63661977236758134308 /* Inverse of PID2 */ #define HUGE 1.797693e308 /* huge value */ #define TINY 2.2e-308 /* tiny value */ #define LOGHUGE 709.778 /* natural log of huge value */ #define LOGTINY -708.396 /* natural log of tiny value */ /** * * External declarations * */ extern int _FPERR; /* floating point arithmetic error */ extern int errno; /* UNIX error code */ #ifndef NARGS extern double acos(double); extern double asin(double); extern double atan(double); extern double atan2(double, double); extern double atof(char *); extern double ceil(double); extern double cos(double); extern double cosh(double); extern void CXFERR(int); extern double drand48(void); extern char *ecvt(double, int, int *, int *); extern double erand48(short *); extern double except(int, char *, double, double, double); extern double exp(double); extern double fabs(double); extern char *fcvt(double, int, int *, int *); extern double floor(double); extern double fmod(double, double); extern double frexp(double, int *); extern char *gcvt(double, int, char *); extern long jrand48(short *); extern double ldexp(double, int); extern void lcong48(short *); extern double log(double); extern double log10(double); extern long lrand48(void); extern int matherr(struct exception *); extern double modf(double, double *); extern long mrand48(void); extern long nrand48(short *); extern double pow(double, double); extern int rand(void); extern short *seed48(short *); extern double sin(double); extern double sinh(double); extern double sqrt(double); extern void srand(unsigned); extern void srand48(long); extern double tan(double); extern double tanh(double); #else extern double acos(); extern double asin(); extern double atan(); extern double atan2(); extern double atof(); extern double ceil(); extern double cos(); extern double cosh(); extern void CXFERR(); extern double drand48(); extern char *ecvt(); extern double erand48(); extern double except(); extern double exp(); extern double fabs(); extern char *fcvt(); extern double floor(); extern double fmod(); extern double frexp(); extern char *gcvt(); extern long jrand48(); extern void lcong48(); extern double ldexp(); extern double log(); extern double log10(); extern long lrand48(); extern int matherr(); extern double modf(); extern long mrand48(); extern long nrand48(); extern double pow(); extern int rand(); extern short *seed48(); extern double sin(); extern double sinh(); extern double sqrt(); extern void srand(); extern void srand48(); extern double tan(); extern double tanh(); #endif /** * * Macros * */ #define abs(x) ((x)<0?-(x):(x)) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<=(b)?(a):(b)) /** * * Define NULL if it's not already defined * */ #ifndef NULL #if SPTR #define NULL 0 /* null pointer value */ #else #define NULL 0L #endif #endif