/* @(#)mathlib.h 1.2 90/02/02 * * Definitions used with the portable math library. * * This is being done because libm.a doesn't appear to be as portable * as originally assumed. * * These routines are taken from two sources: * * 1/ Fred Fishs' portable maths library which was posted to the * comp.sources.unix newsgroup on April 1987. * * acos, acosh, asin, asinh, atan, atanh, cos, cosh, fabs, * exp, log, log10, mod, poly, sin, sinh, sqrt, tan, tanh. * * 2/ The BSD4.3 maths library found on uunet in * bsd_sources/src/usr.lib/libm. * * pow, pow_p, scalb, logb, copysign, finite, drem, exp__E, * log__L. * * Customised and condensed by Rich Burridge, * Sun Microsystems, Australia. * * Permission is given to distribute these sources, as long as the * copyright messages are not removed, and no monies are exchanged. * * No responsibility is taken for any errors or inaccuracies inherent * either to the comments or the code of this program, but if * reported to me then an attempt will be made to fix them. */ /************************************************************************ * * * N O T I C E * * * * Copyright Abandoned, 1987, Fred Fish * * * * This previously copyrighted work has been placed into the * * public domain by the author (Fred Fish) and may be freely used * * for any purpose, private or commercial. I would appreciate * * it, as a courtesy, if this notice is left in all copies and * * derivative works. Thank you, and enjoy... * * * * The author makes no warranty of any kind with respect to this * * product and explicitly disclaims any implied warranties of * * merchantability or fitness for any particular purpose. * * * ************************************************************************ */ /* This file gets included with all of the floating point math * library routines when they are compiled. Note that * this is the proper place to put machine dependencies * whenever possible. * * It should be pointed out that for simplicity's sake, the * environment parameters are defined as floating point constants, * rather than octal or hexadecimal initializations of allocated * storage areas. This means that the range of allowed numbers * may not exactly match the hardware's capabilities. For example, * if the maximum positive double precision floating point number * is EXACTLY 1.11...E100 and the constant "MAXDOUBLE is * defined to be 1.11E100 then the numbers between 1.11E100 and * 1.11...E100 are considered to be undefined. For most * applications, this will cause no problems. * * An alternate method is to allocate a global static "double" variable, * say "maxdouble", and use a union declaration and initialization * to initialize it with the proper bits for the EXACT maximum value. * This was not done because the only compilers available to the * author did not fully support union initialization features. */ extern double acos(), acosh(), asin(), asinh(), atan(), atanh() ; extern double cos(), cosh(), exp(), fabs(), log(), log10(), pow() ; extern double sin(), sinh(), sqrt(), tan(), tanh() ; /*START============start of definitions from ============START * * If your system has a /usr/include/values.h, or has another include * file which defines: * MAXDOUBLE => Maximum double precision number * MINDOUBLE => Minimum double precision number * DMAXEXP => Maximum exponent of a double * DMINEXP => Minimum exponent of a double * * you can comment out these definitions down to the END line below. */ #ifndef BITSPERBYTE /* These values work with any binary representation of integers * where the high-order bit contains the sign. */ /* a number used normally for size of a shift */ #if gcos #define BITSPERBYTE 9 #else #define BITSPERBYTE 8 #endif #define BITS(type) (BITSPERBYTE * (int)sizeof(type)) /* Various values that describe the binary floating-point representation * MAXDOUBLE - the largest double * ((_EXPBASE ** DMAXEXP) * (1 - (_EXPBASE ** -DSIGNIF))) * MINDOUBLE - the smallest double (_EXPBASE ** (DMINEXP - 1)) * DMAXEXP - the maximum exponent of a double (as returned by frexp()) * DMINEXP - the minimum exponent of a double (as returned by frexp()) * DSIGNIF - the number of significant bits in a double * _IEEE - 1 if IEEE standard representation is used * _DEXPLEN - the number of bits for the exponent of a double * _HIDDENBIT - 1 if high-significance bit of mantissa is implicit */ #if u3b || u3b5 || sun #define MAXDOUBLE 1.79769313486231470e+308 #define MINDOUBLE 4.94065645841246544e-324 #define _IEEE 1 #define _DEXPLEN 11 #define _HIDDENBIT 1 #define DMINEXP (-(DMAXEXP + DSIGNIF - _HIDDENBIT - 3)) #endif #if pdp11 || vax #define MAXDOUBLE 1.701411834604692293e+38 #define MINDOUBLE (0.01 * 2.938735877055718770e-37) #define _IEEE 0 #define _DEXPLEN 8 #define _HIDDENBIT 1 #define DMINEXP (-DMAXEXP) #endif #if gcos #define MAXDOUBLE 1.7014118346046923171e+38 #define MINDOUBLE 2.9387358770557187699e-39 #define _IEEE 0 #define _DEXPLEN 8 #define _HIDDENBIT 0 #define DMINEXP (-(DMAXEXP + 1)) #endif #define DSIGNIF (BITS(double) - _DEXPLEN + _HIDDENBIT - 1) #define DMAXEXP ((1 << _DEXPLEN - 1) - 1 + _IEEE) #endif /*BITSPERBYTE*/ /*END==============end of definitions from ==================END*/ #define LOG2_MAXDOUBLE (DMAXEXP + 1) #define LOG2_MINDOUBLE (DMINEXP - 1) #define LOGE_MAXDOUBLE (LOG2_MAXDOUBLE / LOG2E) #define LOGE_MINDOUBLE (LOG2_MINDOUBLE / LOG2E) /* * The following are hacks which should be fixed when I understand all * the issues a little better. |tanh(TANH_MAXARG)| = 1.0 */ #define TANH_MAXARG 16 #define SQRT_MAXDOUBLE 1.304380e19 #define TWOPI (2.0 * PI) #define HALFPI (PI / 2.0) #define FOURTHPI (PI / 4.0) #define SIXTHPI (PI / 6.0) #define LOG2E 1.4426950408889634074 /* Log to base 2 of e */ #define LOG10E 0.4342944819032518276 #define SQRT2 1.4142135623730950488 #define SQRT3 1.7320508075688772935 #define LN2 0.6931471805599453094 #define LNSQRT2 0.3465735902799726547 /* MC68000 HARDWARE DEPENDENCIES * * cc -DIEEE => uses IEEE floating point format * * Apologies for the double negative. I want as few definitions * needed in the default case as possible. */ #ifndef NOIEEE #define X6_UNDERFLOWS (4.209340e-52) /* X**6 almost underflows */ #define X16_UNDERFLOWS (5.421010e-20) /* X**16 almost underflows */ #endif /*NOIEEE*/ /* It is hoped that your system supplies all the mathematical functions * required by calctool. If not then, it is possible to use the needed * ones from the portable math library routines that comes with these * sources. * * There is one definition for each routine used by calctool. These are * commented out by default to signify that this system has that routine. * If you are missing any, then uncomment the appropriate definitions. */ /*#define NEED_ACOS */ /*#define NEED_ACOSH */ /*#define NEED_ASIN */ /*#define NEED_ASINH */ /*#define NEED_ATAN */ /*#define NEED_ATANH */ /*#define NEED_COS */ /*#define NEED_COSH */ /*#define NEED_EXP */ /*#define NEED_LOG */ /*#define NEED_LOG10 */ /*#define NEED_POW */ /*#define NEED_SIN */ /*#define NEED_SINH */ /*#define NEED_SQRT */ /*#define NEED_TAN */ /*#define NEED_TANH */