
Go to the source code of this file.
Data Structures | |
| union | fi |
Defines | |
| #define | POW2_TABLE_SIZE_LOG2 9 |
| Math utilities and approximations for common math functions. | |
| #define | POW2_TABLE_SIZE (1 << POW2_TABLE_SIZE_LOG2) |
| #define | POW2_TABLE_OFFSET (POW2_TABLE_SIZE/2) |
| #define | POW2_TABLE_SCALE ((float)(POW2_TABLE_SIZE/2)) |
| #define | LOG2_TABLE_SIZE_LOG2 16 |
| #define | LOG2_TABLE_SCALE (1 << LOG2_TABLE_SIZE_LOG2) |
| #define | LOG2_TABLE_SIZE (LOG2_TABLE_SCALE + 1) |
| #define | CLAMP(X, MIN, MAX) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) |
| #define | MIN2(A, B) ( (A)<(B) ? (A) : (B) ) |
| #define | MAX2(A, B) ( (A)>(B) ? (A) : (B) ) |
| #define | COPY_4V(DST, SRC) |
| #define | COPY_4FV(DST, SRC) COPY_4V(DST, SRC) |
| #define | ASSIGN_4V(DST, V0, V1, V2, V3) |
Functions | |
| void | util_init_math (void) |
| One time init for math utilities. | |
| static float | util_fast_exp2 (float x) |
| Fast version of 2^x Identity: exp2(a + b) = exp2(a) * exp2(b) Let ipart = int(x) Let fpart = x - ipart; So, exp2(x) = exp2(ipart) * exp2(fpart) Compute exp2(ipart) with i << ipart Compute exp2(fpart) with lookup table. | |
| static float | util_fast_exp (float x) |
| Fast approximation to exp(x). | |
| static float | util_fast_log2 (float x) |
| static float | util_fast_pow (float x, float y) |
| static int | util_ifloor (float f) |
| Floor(x), returned as int. | |
| static int | util_iround (float f) |
| Round float to nearest int. | |
| static unsigned | fui (float f) |
| Return float bits. | |
| static float | ubyte_to_float (ubyte ub) |
| static ubyte | float_to_ubyte (float f) |
| Convert float in [0,1] to ubyte in [0,255] with clamping. | |
| static int | align (int value, int alignment) |
Variables | |
| float | pow2_table [(1<< 9)] |
| 2^x, for x in [-1.0, 1.0) | |
| float | log2_table [((1<< 16)+1)] |
| log2(x), for x in [1.0, 2.0) | |
| #define ASSIGN_4V | ( | DST, | |||
| V0, | |||||
| V1, | |||||
| V2, | |||||
| V3 | ) |
| #define CLAMP | ( | X, | |||
| MIN, | |||||
| MAX | ) | ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) |
| #define COPY_4V | ( | DST, | |||
| SRC | ) |
| #define POW2_TABLE_SIZE_LOG2 9 |
| static int align | ( | int | value, | |
| int | alignment | |||
| ) | [static] |
| static ubyte float_to_ubyte | ( | float | f | ) | [static] |
Convert float in [0,1] to ubyte in [0,255] with clamping.
Definition at line 371 of file u_math.h.
00374 { 00375 const int ieee_0996 = 0x3f7f0000; /* 0.996 or so */ 00376 union fi tmp; 00377 00378 tmp.f = f; 00379 if (tmp.i < 0) { 00380 return (ubyte) 0; 00381 } 00382 else if (tmp.i >= ieee_0996) { 00383 return (ubyte) 255; 00384 } 00385 else { 00386 tmp.f = tmp.f * (255.0f/256.0f) + 32768.0f; 00387 return (ubyte) tmp.i;
| static unsigned fui | ( | float | f | ) | [static] |
| static float util_fast_exp | ( | float | x | ) | [static] |
Fast approximation to exp(x).
Definition at line 243 of file u_math.h.
References util_fast_exp2().
00245 { 00246 const float k = 1.44269f; /* = log2(e) */ 00247 return util_fast_exp2(k * x);
| static float util_fast_exp2 | ( | float | x | ) | [static] |
Fast version of 2^x Identity: exp2(a + b) = exp2(a) * exp2(b) Let ipart = int(x) Let fpart = x - ipart; So, exp2(x) = exp2(ipart) * exp2(fpart) Compute exp2(ipart) with i << ipart Compute exp2(fpart) with lookup table.
Definition at line 213 of file u_math.h.
References fi::f, fi::i, POW2_TABLE_OFFSET, and POW2_TABLE_SCALE.
00215 { 00216 int32_t ipart; 00217 float fpart, mpart; 00218 union fi epart; 00219 00220 if(x > 129.00000f) 00221 return 3.402823466e+38f; 00222 00223 if(x < -126.99999f) 00224 return 0.0f; 00225 00226 ipart = (int32_t) x; 00227 fpart = x - (float) ipart; 00228 00229 /* same as 00230 * epart.f = (float) (1 << ipart) 00231 * but faster and without integer overflow for ipart > 31 */ 00232 epart.i = (ipart + 127 ) << 23; 00233 00234 mpart = pow2_table[POW2_TABLE_OFFSET + (int)(fpart * POW2_TABLE_SCALE)]; 00235 00236 return epart.f * mpart;
| static float util_fast_log2 | ( | float | x | ) | [static] |
Definition at line 257 of file u_math.h.
References fi::f, fi::i, and LOG2_TABLE_SIZE_LOG2.
00259 { 00260 union fi num; 00261 float epart, mpart; 00262 num.f = x; 00263 epart = (float)(((num.i & 0x7f800000) >> 23) - 127); 00264 /* mpart = log2_table[mantissa*LOG2_TABLE_SCALE + 0.5] */ 00265 mpart = log2_table[((num.i & 0x007fffff) + (1 << (22 - LOG2_TABLE_SIZE_LOG2))) >> (23 - LOG2_TABLE_SIZE_LOG2)]; 00266 return epart + mpart;
| static float util_fast_pow | ( | float | x, | |
| float | y | |||
| ) | [static] |
Definition at line 270 of file u_math.h.
References util_fast_exp2(), and util_fast_log2().
00272 { 00273 return util_fast_exp2(util_fast_log2(x) * y);
| static int util_ifloor | ( | float | f | ) | [static] |
Floor(x), returned as int.
Definition at line 281 of file u_math.h.
00283 { 00284 int ai, bi; 00285 double af, bf; 00286 union fi u; 00287 af = (3 << 22) + 0.5 + (double)f; 00288 bf = (3 << 22) + 0.5 - (double)f; 00289 u.f = (float) af; ai = u.i; 00290 u.f = (float) bf; bi = u.i; 00291 return (ai - bi) >> 1;
| void util_init_math | ( | void | ) |
One time init for math utilities.
Definition at line 63 of file u_math.c.
References FALSE, init_log2_table(), init_pow2_table(), and TRUE.
00064 { 00065 static boolean initialized = FALSE; 00066 if (!initialized) { 00067 init_pow2_table(); 00068 init_log2_table(); 00069 initialized = TRUE; 00070 } 00071 }
| static int util_iround | ( | float | f | ) | [static] |
Round float to nearest int.
Definition at line 298 of file u_math.h.
00300 { 00301 #if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86) 00302 int r; 00303 __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st"); 00304 return r; 00305 #elif defined(PIPE_CC_MSVC) && defined(PIPE_ARCH_X86) 00306 int r; 00307 _asm { 00308 fld f 00309 fistp r 00310 } 00311 return r; 00312 #else 00313 if (f >= 0.0f) 00314 return (int) (f + 0.5f); 00315 else 00316 return (int) (f - 0.5f); 00317 #endif
| float log2_table[((1<< 16)+1)] |
| float pow2_table[(1<< 9)] |
1.5.4