72 #define FIXEDPT_BITS 32
77 #if FIXEDPT_BITS == 32
82 #elif FIXEDPT_BITS == 64
88 #error "FIXEDPT_BITS must be equal to 32 or 64"
92 #define FIXEDPT_WBITS 16
95 #if FIXEDPT_WBITS >= FIXEDPT_BITS
96 #error "FIXEDPT_WBITS must be less than or equal to FIXEDPT_BITS"
99 #define FIXEDPT_VCSID "$Id$"
101 #define FIXEDPT_FBITS (FIXEDPT_BITS - FIXEDPT_WBITS)
102 #define FIXEDPT_FMASK (((fixedpt)1 << FIXEDPT_FBITS) - 1)
104 #define fixedpt_rconst(R) ((fixedpt)((R)*FIXEDPT_ONE + ((R) >= 0 ? 0.5 : -0.5)))
105 #define fixedpt_fromint(I) ((fixedptd)(I) << FIXEDPT_FBITS)
106 #define fixedpt_toint(F) ((F) >> FIXEDPT_FBITS)
107 #define fixedpt_add(A, B) ((A) + (B))
108 #define fixedpt_sub(A, B) ((A) - (B))
109 #define fixedpt_xmul(A, B) \
110 ((fixedpt)(((fixedptd)(A) * (fixedptd)(B)) >> FIXEDPT_FBITS))
111 #define fixedpt_xdiv(A, B) \
112 ((fixedpt)(((fixedptd)(A) << FIXEDPT_FBITS) / (fixedptd)(B)))
113 #define fixedpt_fracpart(A) ((fixedpt)(A)&FIXEDPT_FMASK)
115 #define FIXEDPT_ONE ((fixedpt)((fixedpt)1 << FIXEDPT_FBITS))
116 #define FIXEDPT_ONE_HALF (FIXEDPT_ONE >> 1)
117 #define FIXEDPT_TWO (FIXEDPT_ONE + FIXEDPT_ONE)
118 #define FIXEDPT_PI fixedpt_rconst(3.14159265358979323846)
119 #define FIXEDPT_TWO_PI fixedpt_rconst(2 * 3.14159265358979323846)
120 #define FIXEDPT_HALF_PI fixedpt_rconst(3.14159265358979323846 / 2)
121 #define FIXEDPT_E fixedpt_rconst(2.7182818284590452354)
123 #define fixedpt_abs(A) ((A) < 0 ? -(A) : (A))
128 #define fixedpt_tofloat(T) ((float)((T) * ((float)(1) / (float)(1L << FIXEDPT_FBITS))))
159 fixedpt_str(
fixedpt A,
char* str,
int max_dec)
161 int ndec = 0, slen = 0;
168 #if FIXEDPT_BITS == 32
169 #if FIXEDPT_WBITS > 16
174 #elif FIXEDPT_BITS == 64
179 else if (max_dec == -2)
191 tmp[ndec++] =
'0' + ip % 10;
196 str[slen++] = tmp[--ndec];
202 fr = (fr & mask) * 10;
206 }
while (fr != 0 && ndec < max_dec);
208 if (ndec > 1 && str[slen - 1] ==
'0')
209 str[slen - 1] =
'\0';
217 fixedpt_cstr(
const fixedpt A,
const int max_dec)
221 fixedpt_str(A, str, max_dec);
237 if (A < FIXEDPT_ONE && A > 6)
256 for (i = 0; i < iter; i++)
257 l = (l + fixedpt_div(A, l)) >> 1;
289 sqr = fixedpt_mul(fp, fp);
291 result = fixedpt_mul(result, sqr);
293 result = fixedpt_mul(result, sqr);
295 result = fixedpt_mul(result, fp);
296 return sign * result;
310 return fixedpt_div(fixedpt_sin(A), fixedpt_cos(A));
331 k = fixedpt_mul(xabs, LN2_INV);
336 fp -= fixedpt_mul(k, LN2);
337 z = fixedpt_mul(fp, fp);
340 fixedpt_mul(z, EXP_P[0] + fixedpt_mul(z, EXP_P[1] + fixedpt_mul(z, EXP_P[2] + fixedpt_mul(z, EXP_P[3] + fixedpt_mul(z, EXP_P[4])))));
346 return (fixedpt_mul(k, xp));
379 z = fixedpt_mul(s, s);
380 w = fixedpt_mul(z, z);
381 R = fixedpt_mul(w, LG[1] + fixedpt_mul(w, LG[3] + fixedpt_mul(w, LG[5]))) + fixedpt_mul(z, LG[0] + fixedpt_mul(w, LG[2] + fixedpt_mul(w, LG[4] + fixedpt_mul(w, LG[6]))));
389 return (fixedpt_div(fixedpt_ln(x), fixedpt_ln(base)));
400 return (fixedpt_exp(fixedpt_mul(fixedpt_ln(n),
exp)));
#define fixedpt_fracpart(A)
#define fixedpt_rconst(R)
uint32 log2(uint32 m, unsigned int n=32)