Changeset 109 for mppenc/trunk/src/fastmath.h
- Timestamp:
- 11/10/06 22:04:46 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
mppenc/trunk/src/fastmath.h
r97 r109 18 18 */ 19 19 20 #if 1 21 # define ROUND32(x) ( floattmp = (x) + (int)0x00FD8000L, *(int*)(&floattmp) - (int)0x4B7D8000L ) 22 #else 23 # define ROUND32(x) ( (int) floor ((x) + 0.5) ) 24 #endif 20 typedef union mpc_floatint 21 { 22 float f; 23 Int32_t n; 24 } mpc_floatint; 25 26 static __inline Int32_t mpc_nearbyintf(float fVal) 27 { 28 mpc_floatint tmp; 29 tmp.f = fVal + 0x00FF8000; 30 tmp.n = tmp.n - 0x4B7F8000; 31 return tmp.n; 32 } 33 #define mpc_lrintf mpc_nearbyintf 34 static __inline Int32_t mpc_round32(float fVal) 35 { 36 mpc_floatint tmp; 37 tmp.f = fVal + 0x00FD8000; 38 tmp.n = tmp.n - 0x4B7D8000; 39 return tmp.n; 40 } 25 41 26 42 #ifdef FAST_MATH … … 29 45 my_atan2 ( float x, float y ) 30 46 { 31 float t; 32 int i; 33 float ret; 34 float floattmp; 47 float t, ret; int i; mpc_floatint mx, my; 35 48 36 if ( (*(int*)&x & 0x7FFFFFFF) < (*(int*)&y & 0x7FFFFFFF) ) { 37 i = ROUND32 (t = TABSTEP * (x / y)); 49 mx.f = x; 50 my.f = y; 51 if ( (mx.n & 0x7FFFFFFF) < (my.n & 0x7FFFFFFF) ) { 52 i = mpc_round32 (t = TABSTEP * (mx.f / my.f)); 38 53 ret = tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (t-i); 39 if ( *(int*)&y< 0 )54 if ( my.n < 0 ) 40 55 ret = (float)(ret - M_PI); 41 56 } 42 else if ( *(int*)&x < 0) {43 i = ROUND32 (t = TABSTEP * (y / x));57 else if ( mx.n < 0 ) { 58 i = mpc_round32 (t = TABSTEP * (my.f / mx.f)); 44 59 ret = - M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t); 45 60 } 46 else if ( *(int*)&x > 0) {47 i = ROUND32 (t = TABSTEP * (y / x));61 else if ( mx.n > 0 ) { 62 i = mpc_round32 (t = TABSTEP * (my.f / mx.f)); 48 63 ret = + M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t); 49 64 } … … 58 73 my_cos ( float x ) 59 74 { 60 float t; 61 int i; 62 float ret; 63 float floattmp; 64 65 i = ROUND32 (t = TABSTEP * x); 75 float t, ret; int i; 76 i = mpc_round32 (t = TABSTEP * x); 66 77 ret = tabcos [13*TABSTEP+i][0] + tabcos [13*TABSTEP+i][1] * (t-i); 67 78 return ret; … … 72 83 my_ifloor ( float x ) 73 84 { 74 x = x + (0x0C00000L + 0.500000001); 75 return *(int*)&x - 1262485505; 85 mpc_floatint mx; 86 mx.f = (float) (x + (0x0C00000L + 0.500000001)); 87 return mx.n - 1262485505; 76 88 } 77 89 … … 80 92 my_sqrt ( float x ) 81 93 { 82 float ret; 83 int i; 84 int ex = *(int*)&x >> 23; // get the exponent 85 float floattmp; 86 87 *(int*)&x = (*(int*)&x & 0x7FFFFF) | 0x42800000; // delete the exponent 88 i = ROUND32 (x); // Integer-part of the mantissa (round ????????????) 89 ret = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (x-i); // calculate value 94 float ret; int i, ex; mpc_floatint mx; 95 mx.f = x; 96 ex = mx.n >> 23; // get the exponent 97 mx.n = (mx.n & 0x7FFFFF) | 0x42800000; // delete the exponent 98 i = mpc_round32 (mx.f); // Integer-part of the mantissa (round ????????????) 99 ret = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (mx.f-i); // calculate value 90 100 ret *= tabsqrt_ex [ex]; 91 101 return ret;
Note: See TracChangeset
for help on using the changeset viewer.