#ifndef _MATH_EXT_H_ #define _MATH_EXT_H_ /* Some useful constants */ /* The base of natural logarithms, e.*/ #define M_E 2.7182818284590452354 /* The base 2 logarithm of e. (log2e)*/ #define M_LOG2E 1.4426950408889634074 /* The base 10 logarithm of e. (log10e)*/ #define M_LOG10E 0.43429448190325182765 /* The natural logarithm of 2. (ln 2)*/ #define M_LN2 0.69314718055994530942 /* The natural logarithm of 10. (ln 10)*/ #define M_LN10 2.30258509299404568402 /* The circumference of a circle with diameter 1, PI.*/ #define M_PI 3.14159265358979323846 /* Half of PI. (PI/2)*/ #define M_PI_2 1.57079632679489661923 /* A quarter of PI. (PI/4)*/ #define M_PI_4 0.78539816339744830962 /* The inverse of PI. (1/PI)*/ #define M_1_PI 0.31830988618379067154 /* Twice the inverse of PI. (2/PI)*/ #define M_2_PI 0.63661977236758134308 /* The inverse of the square root of PI. (2/(sqrtPI))*/ #define M_2_SQRTPI 1.12837916709551257390 /* The square root of 2. (sqrt2) */ #define M_SQRT2 1.41421356237309504880 /* The inverse of the square root of 2. 1/(sqrt2)*/ #define M_SQRT1_2 0.70710678118654752440 // extra defines /* The circumference of a circle with diameter 1, PI.*/ #define M_PI_F 3.1415927f /* The circumference of a circle with diameter 1, PI.*/ #define M_MINUS_PI_F -3.1415927f /* The circumference of a circle with radius 1, PI*2.*/ #define M_TAU 6.28318530717958647692 /* The circumference of a circle with radius 1, PI*2.*/ #define M_TAU_F 6.2831855f /* Half of PI. (PI/2)*/ #define M_HALF_PI (M_PI_F / 2) /* 3 Halves of PI. (3*(PI/2))*/ #define M_THREE_HALF_PI (3 * M_HALF_PI) #define M_U16_MAX_VALUE_F 65536.0f #define M_U32_MAX_VALUE_F 4294967296.0f /* The difference between 1.0 and the next larger floating point number */ #define FLT_EPSILON 1.19209290E-07F /*Inline Math Funcs*/ #define SECS_TO_TIMER60(SECS) (SECS * GAME_TICKRATE) #define MINS_TO_TIMER60(MINS) (SECS_TO_TIMER60(MINS * GAME_TICKRATE)) /* Gets the byte representation of an angle (degrees) */ #define DEG2BYTE(DEG) (char)(256.0f / 360.0f * (DEG)) /* Gets the byte representation of an angle (radians) */ #define RAD2BYTE(RAD) (char)(256.0f / M_TAU_F * (RAD)) /* Converts an angle from Degrees to Radians */ #define DegToRad(DEG) (float)((DEG) * M_TAU_F / 360.0f) /* Converts an angle from Degrees to Radians with only one multiply*/ #define DegToRad1Fact(DEG) (float)((DEG) * (float)(M_TAU / 360.0)) /* Converts and halves an angle from Degrees to Radians */ #define mDegToHalfRad(x) ((x * M_PI_F) / 360.0f) /* Converts an angle from Radians to Degrees */ #define RadToDeg(RAD) (float)((RAD) * (360.0f / M_TAU_F)) /* Gets the angle in radians represented by a byte */ #define ByteToRadian(Byte) ((Byte * M_TAU_F) * (1.0f / 256.0f)) /* Macro Versions of functions */ #define ABS(x) ((x) < 0 ? -(x) : (x)) /* absolute value of x */ #define SGN(x) ((x) < 0 ? -1 : (x) > 0 ? 1 : 0)/* sign of x */ #define MIN(x, y) ((x) < (y) ? (x) : (y)) /* minimum of x and y */ #define MAX(x, y) ((x) > (y) ? (x) : (y)) /* maximum of x and y */ #define SQR(x) ((x) * (x)) /* square of x */ /** * 0.1f */ #define IDO_POINT_ONE 0.10000001f float sinf(float); double sin(double); float cosf(float); double cos(double); float sqrtf(float); #endif #if 0 #ifndef __MATH_H__ #define __MATH_H__ #ifdef __cplusplus extern "C" { #endif #if (!defined(__SGIDEFS_H__) && defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 400)) # include #endif /* Copyright (C) 1989 Silicon Graphics, Inc. All rights reserved. */ /* ------------------------------------------------------------------ */ /* | Copyright Unpublished, MIPS Computer Systems, Inc. All Rights | */ /* | Reserved. This software contains proprietary and confidential | */ /* | information of MIPS and its suppliers. Use, disclosure or | */ /* | reproduction is prohibited without the prior express written | */ /* | consent of MIPS. | */ /* ------------------------------------------------------------------ */ /* #ident "$Revision: 7.28 $" */ /* ANSI C Notes: * * - THE IDENTIFIERS APPEARING OUTSIDE OF #ifdef __EXTENSIONS__ IN THIS * standard header ARE SPECIFIED BY ANSI! CONFORMANCE WILL BE ALTERED * IF ANY NEW IDENTIFIERS ARE ADDED TO THIS AREA UNLESS THEY ARE IN ANSI's * RESERVED NAMESPACE. (i.e., unless they are prefixed by __[a-z] or * _[A-Z]. For external objects, identifiers with the prefix _[a-z] * are also reserved.) * * - Names created by appending either the suffix 'l' or 'f' * to one of the reserved function names are reserved for the corresponding * single- or extended- precision version of the function. */ /* Power C Notes: * * - Power C assumes that all external functions (unless otherwise marked) * might modify global data and therefore calls to such functions can * not be safely concurrentized. * * - The pragma "no side effects" indicates that the named function is * free from such side effects and calls to it can be concurrentized. * * - This pragma has been added below for each function in the math library * which is "safe". * * - The pragma is properly passed on by 'cpp' & 'c++' and ignored by * 'ccom'. It only has meaning to 'pca'. */ /* * ANSI-standard functions. Each is listed with * its single-precision counterpart, if it exists. */ #if defined(_XOPEN_SOURCE) extern double lgamma(double); # pragma no side effects(lgamma) extern int isnan(double); # pragma no side effects(isnan) extern double erf(double); # pragma no side effects(erf) extern double erfc(double); # pragma no side effects(erfc) extern double gamma(double); extern double hypot(double, double); # pragma no side effects(hypot) extern double j0(double); # pragma no side effects(j0) extern double j1(double); # pragma no side effects(j1) extern double jn(int, double); # pragma no side effects(jn) extern double y0(double); # pragma no side effects(y0) extern double y1(double); # pragma no side effects(y1) extern double yn(int, double); # pragma no side effects(yn) /* Some useful constants */ # define M_E 2.7182818284590452354 # define M_LOG2E 1.4426950408889634074 # define M_LOG10E 0.43429448190325182765 # define M_LN2 0.69314718055994530942 # define M_LN10 2.30258509299404568402 # define M_PI 3.14159265358979323846 # define M_PI_2 1.57079632679489661923 # define M_PI_4 0.78539816339744830962 # define M_1_PI 0.31830988618379067154 # define M_2_PI 0.63661977236758134308 # define M_2_SQRTPI 1.12837916709551257390 # define M_SQRT2 1.41421356237309504880 # define M_SQRT1_2 0.70710678118654752440 # ifndef _MAXFLOAT # define _MAXFLOAT # define MAXFLOAT ((float)3.40282346638528860e+38) # endif /* _MAXFLOAT */ extern int signgam; #endif /* _XOPEN_SOURCE */ extern double acos(double); #pragma no side effects(acos) extern float acosf(float); #pragma no side effects(acosf) extern double asin(double); #pragma no side effects(asin) extern float asinf(float); #pragma no side effects(asinf) extern double atan(double); #pragma no side effects(atan) extern float atanf(float); #pragma no side effects(atanf) extern double atan2(double, double); #pragma no side effects(atan2) extern float atan2f(float, float); #pragma no side effects(atan2f) extern double cos(double); #pragma no side effects(cos) extern float cosf(float); #pragma no side effects(cosf) extern double sin(double); #pragma no side effects(sin) extern float sinf(float); #pragma no side effects(sinf) extern double tan(double); #pragma no side effects(tan) extern float tanf(float); #pragma no side effects(tanf) extern double cosh(double); #pragma no side effects(cosh) extern float coshf(float); #pragma no side effects(coshf) extern double sinh(double); #pragma no side effects(sinh) extern float sinhf(float); #pragma no side effects(sinhf) extern double tanh(double); #pragma no side effects(tanh) extern float tanhf(float); #pragma no side effects(tanhf) extern double exp(double); #pragma no side effects(exp) extern float expf(float); #pragma no side effects(expf) extern double frexp(double, int *); #if 0 /* not yet implemented */ extern float frexpf(float, int *); #endif extern double ldexp(double, int); #if 0 /* not yet implemented */ extern float ldexpf(float, int); #endif extern double log(double); #pragma no side effects(log) extern float logf(float); #pragma no side effects(logf) extern double log10(double); #pragma no side effects(log10) extern float log10f(float); #pragma no side effects(log10f) extern double modf(double, double *); /* version of modff implemented for completeness only */ extern float modff(float, float *); extern double pow(double, double); #pragma no side effects(pow) /* version of powf implemented for completeness only */ extern float powf(float, float); #pragma no side effects(powf) extern double sqrt(double); #pragma no side effects(sqrt) extern float sqrtf(float); #pragma no side effects(sqrtf) extern double ceil(double); #pragma no side effects(ceil) extern float ceilf(float); #pragma no side effects(ceilf) extern double fabs(double); #pragma no side effects(fabs) /* version of fabsf implemented for completeness only */ extern float fabsf(float); #pragma no side effects(fabsf) extern double floor(double); #pragma no side effects(floor) extern float floorf(float); #pragma no side effects(floorf) extern double fmod(double, double); #pragma no side effects(fmod) /* version of fmodf implemented for completeness only */ extern float fmodf(float, float); #pragma no side effects(fmodf) #ifndef HUGE_VAL /* Also in limits.h */ # ifdef _SVR4_SOURCE # ifndef __TYPEDEF_H_VAL # define __TYPEDEF_H_VAL typedef union _h_val { # if (_MIPS_SZLONG == 32) unsigned long i[2]; # endif # if (_MIPS_SZLONG == 64) __uint32_t i[2]; # endif double d; } _h_val; # endif /* __TYPEDEF_H_VAL */ extern const _h_val __huge_val; # define HUGE_VAL __huge_val.d # else /* __infinity is a double-precision variable in libc set to infinity */ extern const double __infinity; # define HUGE_VAL __infinity # endif /* _SVR4_SOURCE */ #endif /* !HUGE_VAL */ #if (defined(__EXTENSIONS__) || defined(_POSIX_SOURCE)) extern int errno, signgam; extern double atof(const char *); extern int rand(void); extern void srand(unsigned); #endif /* __EXTENSIONS__ || _POSIX_SOURCE */ #if (defined(__EXTENSIONS__) && (!defined(_POSIX_SOURCE) && !defined(_XOPEN_SOURCE))) enum version { c_issue_4, ansi_1, strict_ansi }; extern const enum version _lib_version; /* Features from 4.3BSD */ extern double rint(double); # pragma no side effects(rint) extern double asinh(double); # pragma no side effects(asinh) extern double acosh(double); # pragma no side effects(acosh) extern double atanh(double); # pragma no side effects(atanh) extern double log1p(double); # pragma no side effects(log1p) extern double erf(double); # pragma no side effects(erf) extern double erfc(double); # pragma no side effects(erfc) extern double expm1(double); # pragma no side effects(expm1) extern double gamma(double); extern double hypot(double, double); # pragma no side effects(hypot) struct __cabs_s { double a, b; }; extern double cabs(struct __cabs_s); # pragma no side effects(cabs) extern double copysign(double, double); # pragma no side effects(copysign) extern double drem(double, double); # pragma no side effects(drem) extern double logb(double); # pragma no side effects(logb) # if (defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 400)) extern double nextafter(double, double); # pragma no side effects(nextafter) extern double remainder(double, double); # pragma no side effects(remainder) # endif extern double scalb(double, double); # pragma no side effects(scalb) extern int finite(double); # pragma no side effects(finite) extern double j0(double); # pragma no side effects(j0) extern double j1(double); # pragma no side effects(j1) extern double jn(int, double); # pragma no side effects(jn) extern double y0(double); # pragma no side effects(y0) extern double y1(double); # pragma no side effects(y1) extern double yn(int, double); # pragma no side effects(yn) extern double cbrt(double); # pragma no side effects(cbrt) extern double atof(const char *); extern double strtod(const char *, char **); extern double trunc(double); # pragma no side effects(trunc) extern int rand(void); extern void srand(unsigned); extern long random(void); extern int srandom(unsigned); /* doesn't return a value -- should be void */ extern char * initstate(unsigned int, char *, int); extern char * setstate(char *); extern double drand48(void); extern double erand48(unsigned short[3]); extern long lrand48(void); extern long nrand48(unsigned short[3]); extern long mrand48(void); extern long jrand48(unsigned short[3]); extern void srand48(long); extern unsigned short *seed48(const unsigned short[3]); extern void lcong48(const unsigned short[7]); /* Map old MIPS names of single-precision forms to ANSI names.*/ # define facos acosf # define fasin asinf # define fatan atanf # define fatan2 atan2f # define fcos cosf # define fsin sinf # define ftan tanf # define fcosh coshf # define fsinh sinhf # define ftanh tanhf # define fexp expf # define flog logf # define flog10 log10f # define fsqrt sqrtf # define fceil ceilf # define ffloor floorf /* similar mapping of old MIPS names to ANSI-like names */ # undef flog1p # define flog1p log1pf # define ftrunc truncf # ifdef __cplusplus # ifndef _ABS_ # define _ABS_ inline int abs(int x) { return x > 0 ? x : -x; } # endif # endif /* additional single-percision forms */ extern float fhypot(float, float); # pragma no side effects(fhypot) extern float hypotf(float, float); # pragma no side effects(hypotf) struct __fcabs_s { float a, b; }; extern float fcabs(struct __fcabs_s); # pragma no side effects(fcabs) extern float fexpm1(float); # pragma no side effects(fexpm1) extern float expm1f(float); # pragma no side effects(expm1f) extern float log1pf(float); # pragma no side effects(log1pf) extern float truncf(float); # pragma no side effects(truncf) # if (defined(__INLINE_INTRINSICS) && defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 400)) # if _MIPS_ISA != _MIPS_ISA_MIPS1 # pragma intrinsic(hypotf) # pragma intrinsic(fhypot) # endif # endif # if 0 /* These are not implemented yet. */ extern float ferf(float); extern float ferfc(float); extern float flgamma(float); extern float fcopysign(float, float); extern float fdrem(float, float); extern float flogb(float); extern float fscalb(float, int); extern int ffinite(float); extern float fj0(float); extern float fj1(float); extern float fjn(int, float); extern float fy0(float); extern float fy1(float); extern float fyn(int, float); extern float fatof(char *); extern float frint(float); extern float facosh(float); extern float fatanh(float); extern float fcbrt(float); # endif /* 0 */ /* Some useful constants */ /* The base of natural logarithms, e.*/ # define M_E 2.7182818284590452354 /* The base 2 logarithm of e. (log2e)*/ # define M_LOG2E 1.4426950408889634074 /* The base 10 logarithm of e. (log10e)*/ # define M_LOG10E 0.43429448190325182765 /* The natural logarithm of 2. (ln 2)*/ # define M_LN2 0.69314718055994530942 /* The natural logarithm of 10. (ln 10)*/ # define M_LN10 2.30258509299404568402 /* The circumference of a circle with diameter 1, PI.*/ # define M_PI 3.14159265358979323846 /* Half of PI. (?/2)*/ # define M_PI_2 1.57079632679489661923 /* A quarter of PI. (?/4)*/ # define M_PI_4 0.78539816339744830962 /* The inverse of PI. (1/?)*/ # define M_1_PI 0.31830988618379067154 /* Twice the inverse of PI. (2/?)*/ # define M_2_PI 0.63661977236758134308 /* The inverse of the square root of PI. (2/(??))*/ # define M_2_SQRTPI 1.12837916709551257390 /* The square root of 2. (?2) */ # define M_SQRT2 1.41421356237309504880 /* The inverse of the square root of 2. 1/(?2)*/ # define M_SQRT1_2 0.70710678118654752440 # ifndef HUGE # ifdef MAXFLOAT # define HUGE MAXFLOAT # else # define HUGE ((float)3.40282346638528860e+38) /* value of MAXFLOAT */ # endif /* MAXFLOAT */ # endif /* !HUGE */ # define _ABS(x) ((x) < 0 ? -(x) : (x)) # define _REDUCE(TYPE, X, XN, C1, C2) \ { \ double x1 = (double)(TYPE)X, x2 = X - x1; \ X = x1 - (XN) * (C1); \ X += x2; \ X -= (XN) * (C2); \ } # define _POLY1(x, c) ((c)[0] * (x) + (c)[1]) # define _POLY2(x, c) (_POLY1((x), (c)) * (x) + (c)[2]) # define _POLY3(x, c) (_POLY2((x), (c)) * (x) + (c)[3]) # define _POLY4(x, c) (_POLY3((x), (c)) * (x) + (c)[4]) # define _POLY5(x, c) (_POLY4((x), (c)) * (x) + (c)[5]) # define _POLY6(x, c) (_POLY5((x), (c)) * (x) + (c)[6]) # define _POLY7(x, c) (_POLY6((x), (c)) * (x) + (c)[7]) # define _POLY8(x, c) (_POLY7((x), (c)) * (x) + (c)[8]) # define _POLY9(x, c) (_POLY8((x), (c)) * (x) + (c)[9]) struct exception { int type; char * name; double arg1; double arg2; double retval; }; extern int matherr(struct exception *p); # include #endif /* __EXTENSIONS__ && !_POSIX_SOURCE */ #ifdef __INLINE_INTRINSICS /* The functions made intrinsic here can be activated by the driver ** passing -D__INLINE_INTRINSICS to cfe, but cfe should ensure that ** this has no effect unless the hardware architecture directly ** supports these basic operations. */ # if _MIPS_ISA != _MIPS_ISA_MIPS1 # pragma intrinsic(sqrt) # pragma intrinsic(sqrtf) # if (defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 400)) # pragma intrinsic(pow) # pragma intrinsic(powf) # endif # endif # pragma intrinsic(fabs) # pragma intrinsic(fabsf) #endif #ifdef __cplusplus } #endif #endif /* !__MATH_H__ */ #endif