19 #define FP_BITS( fp ) ( ( *(DWORD*) &(fp) ) )
20 #define FP_ABS_BITS( fp ) ( (FP_BITS( fp )&0x7FFFFFFF) )
21 #define FP_SIGN_BIT( fp ) ( (FP_BITS( fp )&0x80000000) )
22 #define FP_ONE_BITS ( (0x3F800000) )
23 #define __forceinline inline
27 #define FP_INV( r, p ) \
29 int _i = 2*FP_ONE_BITS-*(int*) &(p); \
44 #define FP_INV2( r, p ) \
46 __asm {mov eax, 0x7F000000}; \
47 __asm {sub eax, dword ptr[p]}; \
48 __asm {mov dword ptr[r], eax}; \
49 __asm {fld dword ptr[p]}; \
50 __asm {fmul dword ptr[r]}; \
52 __asm {fmul dword ptr[r]}; \
53 __asm {fstp dword ptr[r]}; \
59 #define FP_EXP( e, p ) \
62 e = -1.44269504f*(float) 0x00800000*(p); \
63 _i = (int) e+0x3F800000; \
68 #define FP_NORM_TO_BYTE( i, p ) \
70 float _n = (p)+1.0f; \
72 if (i >= 0x40000000) i = 0xFF; \
73 else if (i <= 0x3F800000) \
75 else i = ( (i)>>15 )&0xFF; \
82 return ( (*(
unsigned*) &fpTmp)>>15 )&0xFF;
87 float ftmp = p+12582912.0f;
88 return (*(
unsigned long*) &ftmp)&0xFF;
91 static unsigned int fast_sqrt_table[0x10000];
102 for (i = 0; i <= 0x7FFF; i++) {
106 s.
i = (i<<8)|(0x7F<<23);
107 s.
f = (float)
sqrt( s.
f );
112 fast_sqrt_table[i+0x8000] = (s.
i&0x7FFFFF);
117 s.
i = (i<<8)|(0x80<<23);
118 s.
f = (float)
sqrt( s.
f );
120 fast_sqrt_table[i] = (s.
i&0x7FFFFF);
129 FP_BITS( n ) = fast_sqrt_table[(
FP_BITS( n )>>8)&0xFFFF]|( ( ( (
FP_BITS( n )-0x3F800000)>>1 )+0x3F800000 )&0x7F800000 );
143 float t, it, test_sqrt;
149 printf(
"sqrt expected %20.10f approx %20.10f\n",
sqrt( t ), test_sqrt );
151 printf(
"inv expected %20.10f approx %20.10f\n", 1/t, it );
154 printf(
"ftol expected %d actual %d %08X\n", (
int) t, i, i );
205 pdx = testpt.
x-pt1.
x;
206 pdy = testpt.
y-pt1.
y;
207 pdz = testpt.
z-pt1.
z;
210 dot = pdx*dx+pdy*dy+pdz*dz;
214 if (dot < 0.0f || dot > lengthsq) {
228 dsq = (pdx*pdx+pdy*pdy+pdz*pdz)-dot*dot/lengthsq;