/* ##C_FILE# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FILE : MTH_fopt.c MODULE : MTH (Common Mathematic Library) DESCRIPTION : Optimization for PC and float VERSION : MTH V5.0.13 / Alexandre LANGER [ALX] Ubi R&D / Add Comments ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* NOT for U64 */ #ifndef U64 /* ##INCLUDE#---------------------------------------------------------------------------- Includes Files ---------------------------------------------------------------------------------------*/ #include #include "cpa_expt.h" /* ##GLOBVAR#---------------------------------------------------------------------------- Globale variable declaration ---------------------------------------------------------------------------------------*/ double MTH_gs_dDecal; /* = 3.0F*pow(2, 51); */ /* sqrt : */ CPA_EXPORT unsigned long MTH_g_a2048_fSquareRootTable[1024*2]; /* div : */ CPA_EXPORT unsigned long MTH_g_a1024_fInverse[1024]; /* inv sqrt : */ CPA_EXPORT unsigned long MTH_g_a2048_fInvSquareRootTable[1024*2]; /* ##FUNCDEF#---------------------------------------------------------------------------- Functions definition ---------------------------------------------------------------------------------------*/ /* ##-########################### ## SQRT ############################## */ /* ##F=================================================================================== NAME : MTH_fn_vInitSqrtRootOpt DESCRIPTION : Initialize Square root table INPUT : void OUTPUT : void =======================================================================================*/ void MTH_fn_vInitSqrtRootOpt( void ) { long i; float ft; unsigned long m; for ( i=0; i<1024; i++) { ft = (float) sqrt((double) 1.0+((float)i/1024) ); m = *(long *)&ft; m&= 0x7FFFFF; MTH_g_a2048_fSquareRootTable[i+1024] = m; ft = (float) ( sqrt(2.0)*sqrt((double) 1.0+((float)i/1024) ) ); m = *(long *)&ft; m&= 0x7FFFFF; MTH_g_a2048_fSquareRootTable[i] = m; } } /* ##-########################### ## DIV ############################## */ /* ##F=================================================================================== NAME : MTH_fn_vInitInverseOpt DESCRIPTION : Initialize Inverse table INPUT : void OUTPUT : void =======================================================================================*/ void MTH_fn_vInitInverseOpt( void ) { long i; float ft; for ( i=0; i<1024; i++ ) { ft = 1.0F / ( 1.0F + ((float)i/1024) ); MTH_g_a1024_fInverse[i] = (*(long *)&ft) & 0x7FFFFF; } MTH_g_a1024_fInverse[0]=(1<<23); /* Because of problems with 2^n */ } /* ##-########################### ## INV SQRT ############################## */ /* ##F=================================================================================== NAME : MTH_fn_vInitInvSqrtRootOpt DESCRIPTION : Initialize Inverse Square root table INPUT : void OUTPUT : void =======================================================================================*/ void MTH_fn_vInitInvSqrtRootOpt(void) { long i; /* index on the table */ unsigned long m; /* mantis */ float ft; /* float value */ for ( i=0; i<1024; i++ ) { ft = (float) ( 2.0/sqrt((double)( 1.0+((float)i/1024) )) ); m = *(long *)&ft; m &= 0x7FFFFF; MTH_g_a2048_fInvSquareRootTable[i+1024] = m; ft = (float) ( sqrt(2.0)/sqrt((double)( 1.0+((float)i/1024) )) ); m = *(long *)&ft; m &= 0x7FFFFF; m+=0x800000; MTH_g_a2048_fInvSquareRootTable[i] = m; } MTH_g_a2048_fInvSquareRootTable[1024]=(1<<23); } /* ##-########################### ## INIT ############################## */ /* ##F=================================================================================== NAME : MTH_fn_vInit DESCRIPTION : Initialize all table if it not yet done INPUT : void OUTPUT : void =======================================================================================*/ void MTH_fn_vInit( void ) { static unsigned char InitDone=0; MTH_gs_dDecal= 3.0F*pow(2, 51); if(InitDone==0) { MTH_fn_vInitSqrtRootOpt(); MTH_fn_vInitInverseOpt(); MTH_fn_vInitInvSqrtRootOpt(); InitDone=1; } } #endif /* NOT U64 */