mpcmath.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <mpc/mpc_types.h>
00020
00021 typedef union mpc_floatint
00022 {
00023 float f;
00024 mpc_int32_t n;
00025 } mpc_floatint;
00026
00027 typedef union mpc_doubleint
00028 {
00029 double d;
00030 mpc_int32_t n[2];
00031 } mpc_doubleint;
00032
00033 static mpc_inline mpc_int32_t mpc_lrintf(float fVal)
00034 {
00035 mpc_floatint tmp;
00036 tmp.f = fVal + 0x00FF8000;
00037 return tmp.n - 0x4B7F8000;
00038 }
00039
00040 #define mpc_round32 mpc_lrintf
00041 #define mpc_nearbyintf mpc_lrintf
00042
00043
00044 #ifndef M_PI
00045 # define M_PI 3.1415926535897932384626433832795029 // 4*atan(1)
00046 # define M_PIl 3.1415926535897932384626433832795029L
00047 # define M_LN2 0.6931471805599453094172321214581766 // ln(2)
00048 # define M_LN2l 0.6931471805599453094172321214581766L
00049 # define M_LN10 2.3025850929940456840179914546843642 // ln 10 */
00050 # define M_LN10l 2.3025850929940456840179914546843642L
00051 #endif
00052
00053
00054 #if defined(__GNUC__) && !defined(__APPLE__)
00055 # define SIN(x) sinf ((float)(x))
00056 # define COS(x) cosf ((float)(x))
00057 # define ATAN2(x,y) atan2f ((float)(x), (float)(y))
00058 # define SQRT(x) sqrtf ((float)(x))
00059 # define LOG(x) logf ((float)(x))
00060 # define LOG10(x) log10f ((float)(x))
00061 # define POW(x,y) expf (logf(x) * (y))
00062 # define POW10(x) expf (M_LN10 * (x))
00063 # define FLOOR(x) floorf ((float)(x))
00064 # define IFLOOR(x) (int) floorf ((float)(x))
00065 # define FABS(x) fabsf ((float)(x))
00066 #else
00067 # define SIN(x) (float) sin (x)
00068 # define COS(x) (float) cos (x)
00069 # define ATAN2(x,y) (float) atan2 (x, y)
00070 # define SQRT(x) (float) sqrt (x)
00071 # define LOG(x) (float) log (x)
00072 # define LOG10(x) (float) log10 (x)
00073 # define POW(x,y) (float) pow (x,y)
00074 # define POW10(x) (float) pow (10., (x))
00075 # define FLOOR(x) (float) floor (x)
00076 # define IFLOOR(x) (int) floor (x)
00077 # define FABS(x) (float) fabs (x)
00078 #endif
00079
00080 #define SQRTF(x) SQRT (x)
00081 #ifdef FAST_MATH
00082 # define TABSTEP 64
00083 # define COSF(x) my_cos ((float)(x))
00084 # define ATAN2F(x,y) my_atan2 ((float)(x), (float)(y))
00085 # define IFLOORF(x) my_ifloor ((float)(x))
00086
00087 void Init_FastMath ( void );
00088 extern const float tabatan2 [] [2];
00089 extern const float tabcos [] [2];
00090 extern const float tabsqrt_ex [];
00091 extern const float tabsqrt_m [] [2];
00092
00093 static mpc_inline float my_atan2 ( float x, float y )
00094 {
00095 float t, ret; int i; mpc_floatint mx, my;
00096
00097 mx.f = x;
00098 my.f = y;
00099 if ( (mx.n & 0x7FFFFFFF) < (my.n & 0x7FFFFFFF) ) {
00100 i = mpc_round32 (t = TABSTEP * (mx.f / my.f));
00101 ret = tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (t-i);
00102 if ( my.n < 0 )
00103 ret = (float)(ret - M_PI);
00104 }
00105 else if ( mx.n < 0 ) {
00106 i = mpc_round32 (t = TABSTEP * (my.f / mx.f));
00107 ret = - M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t);
00108 }
00109 else if ( mx.n > 0 ) {
00110 i = mpc_round32 (t = TABSTEP * (my.f / mx.f));
00111 ret = + M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t);
00112 }
00113 else {
00114 ret = 0.;
00115 }
00116 return ret;
00117 }
00118
00119
00120 static mpc_inline float my_cos ( float x )
00121 {
00122 float t, ret; int i;
00123 i = mpc_round32 (t = TABSTEP * x);
00124 ret = tabcos [13*TABSTEP+i][0] + tabcos [13*TABSTEP+i][1] * (t-i);
00125 return ret;
00126 }
00127
00128
00129 static mpc_inline int my_ifloor ( float x )
00130 {
00131 mpc_floatint mx;
00132 mx.f = (float) (x + (0x0C00000L + 0.500000001));
00133 return mx.n - 1262485505;
00134 }
00135
00136
00137 static mpc_inline float my_sqrt ( float x )
00138 {
00139 float ret; int i, ex; mpc_floatint mx;
00140 mx.f = x;
00141 ex = mx.n >> 23;
00142 mx.n = (mx.n & 0x7FFFFF) | 0x42800000;
00143 i = mpc_round32 (mx.f);
00144 ret = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (mx.f-i);
00145 ret *= tabsqrt_ex [ex];
00146 return ret;
00147 }
00148 #else
00149 # define COSF(x) COS (x)
00150 # define ATAN2F(x,y) ATAN2 (x,y)
00151 # define IFLOORF(x) IFLOOR (x)
00152 #endif
00153