/* * bltMath.h -- * * Copyright 1993-1998 Lucent Technologies, Inc. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby * granted, provided that the above copyright notice appear in all * copies and that both that the copyright notice and warranty * disclaimer appear in supporting documentation, and that the names * of Lucent Technologies any of their entities not be used in * advertising or publicity pertaining to distribution of the software * without specific, written prior permission. * * Lucent Technologies disclaims all warranties with regard to this * software, including all implied warranties of merchantability and * fitness. In no event shall Lucent Technologies be liable for any * special, indirect or consequential damages or any damages * whatsoever resulting from loss of use, data or profits, whether in * an action of contract, negligence or other tortuous action, arising * out of or in connection with the use or performance of this * software. */ #ifndef _BLT_MATH_H #define _BLT_MATH_H #include #ifdef HAVE_FLOAT_H #include #endif #ifdef HAVE_IEEEFP_H #include #endif /* HAVE_IEEEFP_H */ #ifndef M_PI #define M_PI 3.14159265358979323846 #endif /* M_PI */ #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 #endif /* M_SQRT2 */ #ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440 #endif /* M_SQRT1_2 */ #ifndef SHRT_MAX #define SHRT_MAX 0x7FFF #endif /* SHRT_MAX */ #ifndef SHRT_MIN #define SHRT_MIN -(SHRT_MAX) #endif /* SHRT_MAX */ #ifndef USHRT_MAX #define USHRT_MAX 0xFFFF #endif /* USHRT_MAX */ #ifndef INT_MAX #define INT_MAX 2147483647 #endif /* INT_MAX */ #ifndef HAVE_FLOAT_H /* * ---------------------------------------------------------------------- * * DBL_MIN, DBL_MAX -- * * DBL_MAX and DBL_MIN are the largest and smaller double * precision numbers that can be represented by the floating * point hardware. If the compiler is ANSI, they can be found in * float.h. Otherwise, we use HUGE_VAL or HUGE to determine * them. * * ---------------------------------------------------------------------- */ /* * Don't want to include __infinity (definition of HUGE_VAL (SC1.x)) */ #ifdef sun #define DBL_MAX 1.7976931348623157E+308 #define DBL_MIN 2.2250738585072014E-308 #define DBL_EPSILON 2.2204460492503131e-16 #else #ifdef HUGE_VAL #define DBL_MAX HUGE_VAL #define DBL_MIN (1/HUGE_VAL) #else #ifdef HUGE #define DBL_MAX HUGE #define DBL_MIN (1/HUGE) #else /* * Punt: Assume relatively small values */ #define DBL_MAX 3.40282347E+38 #define DBL_MIN 1.17549435E-38 #endif /*HUGE*/ #endif /*HUGE_VAL*/ #endif /*sun*/ #ifndef BLT_DBL_EPSILON # define BLT_DBL_EPSILON 2.2204460492503131e-16 #endif #ifndef BLT_FLT_EPSILON # define BLT_FLT_EPSILON 1.19209290e-07F #endif #ifndef DBL_EPSILON # define DBL_EPSILON BLT_DBL_EPSILON #endif #ifndef FLT_EPSILON # define FLT_EPSILON BLT_FLT_EPSILON #endif #endif /*!HAVE_FLOAT_H*/ /* * ---------------------------------------------------------------------- * * The following are macros replacing math library functions: * "fabs", "fmod", "abs", "rint", and "exp10". * * Although many of these routines may exist in your math * library, they aren't used in libtcl.a or libtk.a. This makes * it difficult to dynamically load the BLT library as a shared * object unless the math library is also shared (which isn't * true on several systems). We can avoid the problem by * replacing the "exotic" math routines with macros. * * ---------------------------------------------------------------------- */ #undef ABS #define ABS(x) (((x)<0)?(-(x)):(x)) #undef EXP10 #define EXP10(x) (pow(10.0,(x))) #undef FABS #define FABS(x) (((x)<0.0)?(-(x)):(x)) #undef SIGN #define SIGN(x) (((x) < 0.0) ? -1 : 1) /* * Be careful when using the next two macros. They both assume the floating * point number is less than the size of an int. That means, for example, you * can't use these macros with numbers bigger than than 2^31-1. */ #undef FMOD #define FMOD(x,y) ((x)-(((int)((x)/(y)))*y)) #undef ROUND #define ROUND(x) ((int)((x) + (((x)<0.0) ? -0.5 : 0.5))) #ifdef HAVE_FINITE #define FINITE(x) finite(x) #else #ifdef HAVE_ISFINITE #define FINITE(x) isfinite(x) #else #ifdef HAVE_ISNAN #define FINITE(x) (!isnan(x)) #else #define FINITE(x) (TRUE) #endif /* HAVE_ISNAN */ #endif /* HAVE_ISFINITE */ #endif /* HAVE_FINITE */ extern double bltNaN; #define DEFINED(x) (!isnan(x)) #define UNDEFINED(x) (isnan(x)) #define VALUE_UNDEFINED bltNaN /* * ---------------------------------------------------------------------- * * On some systems "strdup" and "strcasecmp" are in the C library, * but have no declarations in the C header files. Make sure we * supply them here. * * ---------------------------------------------------------------------- */ #ifdef NEED_DECL_STRDUP extern char *strdup _ANSI_ARGS_((CONST char *s)); #endif /* NEED_DECL_STRDUP */ #ifndef HAVE_STRTOLOWER extern void strtolower _ANSI_ARGS_((char *s)); #endif /* HAVE_STRTOLOWER */ #ifdef NEED_DECL_DRAND48 extern double drand48 _ANSI_ARGS_((void)); extern void srand48 _ANSI_ARGS_((long seed)); #endif /* NEED_DECL_DRAND48 */ #ifdef NEED_DECL_STRCASECMP extern int strcasecmp _ANSI_ARGS_((CONST char *s1, CONST char *s2)); #endif /* NEED_DECL_STRCASECMP */ #endif /* BLT_MATH_H */