00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "Util/log.H"
00039 #include "Util/MathFunctions.H"
00040 #include "Util/Timer.H"
00041 #include <stdio.h>
00042 #include <stdlib.h>
00043
00044 int main(const int argc, const char** argv)
00045 {
00046 const int large_samples = (int)pow(2,8);
00047 const int loops = (int)pow(2,8);
00048 const int ticks_per_sec = 1000000;
00049 LINFO("Using %d large samples",large_samples);
00050 LINFO("Using %d loops",loops);
00051 double DLA[large_samples + 1];
00052 float FLA[large_samples + 1];
00053 int ILA[large_samples + 1];
00054
00055 {
00056 for(int i = 0; i < large_samples; i++)
00057 {
00058 DLA[i] = pow(rand(),10*rand());
00059 FLA[i] = (float)DLA[i];
00060 ILA[i] = static_cast<int>(round(DLA[i]));
00061 }
00062 }
00063
00064 Timer tim(ticks_per_sec);
00065 LINFO("Ticks per second %d",tim.ticksPerSec());
00066 tim.reset();
00067 int t1,t2,t3;
00068
00069
00070 {
00071 float store;
00072 t1 = tim.get();
00073 for(int l = 0; l < loops; l++)
00074 {
00075 for(int k = 0; k < loops; k++)
00076 {
00077 store = 0.0f;
00078 for(int i = 0; i < large_samples; i++)
00079 {
00080 store += sqrt(FLA[i]);
00081 }
00082 }
00083 }
00084 t2 = tim.get();
00085 t3 = t2 - t1;
00086 LINFO(">>> Time for float SQRT - %d mcs (result %f)",t3,store);
00087 }
00088
00089
00090 {
00091 double store;
00092 t1 = tim.get();
00093 for(int l = 0; l < loops; l++)
00094 {
00095 for(int k = 0; k < loops; k++)
00096 {
00097 store = 0.0F;
00098 for(int i = 0; i < large_samples; i++)
00099 {
00100 store += sqrt(DLA[i]);
00101 }
00102 }
00103 }
00104 t2 = tim.get();
00105 t3 = t2 - t1;
00106 LINFO(">>> Time for double SQRT - %d mcs (result %f)",t3,store);
00107 }
00108
00109 LINFO("<<<NEXT>>>");
00110
00111
00112 {
00113 LINFO("fastSqrt_2 : Log 2 Approx Fast Square Root - Float");
00114 const int samples = 7;
00115
00116 float A[samples];
00117 float F[samples];
00118 float N[samples];
00119
00120 A[0] = 1.0f;
00121 A[1] = 2.0f;
00122 A[2] = 8.0f;
00123 A[3] = 100.0f;
00124 A[4] = M_PI;
00125 A[5] = 100000;
00126 A[6] = 1.0f/3.0f;
00127
00128 for(int i = 0; i < samples; i++)
00129 {
00130 F[i] = fastSqrt_2(A[i]);
00131 N[i] = sqrt(A[i]);
00132 LINFO("\t%d SQRT %f - Log 2 Fast %f Normal %f",i,A[i],F[i],N[i]);
00133 }
00134
00135 float store;
00136 t1 = tim.get();
00137 for(int l = 0; l < loops; l++)
00138 {
00139 for(int k = 0; k < loops; k++)
00140 {
00141 store = 0.0f;
00142 for(int i = 0; i < large_samples; i++)
00143 {
00144 store += fastSqrt_2(FLA[i]);
00145 }
00146 }
00147 }
00148 t2 = tim.get();
00149 t3 = t2 - t1;
00150 LINFO(">>> Time for Log 2 fast float SQRT - %d mcs (result %f)",t3,store);
00151 }
00152
00153 LINFO("<<<NEXT>>>");
00154
00155
00156 {
00157 LINFO("fastSqrt_Bab : Log 2 Babylonian Approx Fast Square Root - Float");
00158 const int samples = 7;
00159
00160 float A[samples];
00161 float F[samples];
00162 float N[samples];
00163
00164 A[0] = 1.0f;
00165 A[1] = 2.0f;
00166 A[2] = 8.0f;
00167 A[3] = 100.0f;
00168 A[4] = M_PI;
00169 A[5] = 100000;
00170 A[6] = 1.0f/3.0f;
00171
00172 for(int i = 0; i < samples; i++)
00173 {
00174 F[i] = fastSqrt_Bab(A[i]);
00175 N[i] = sqrt(A[i]);
00176 LINFO("\t%d SQRT %f - Log 2 Fast Babylonian %f Normal %f",
00177 i,A[i],F[i],N[i]);
00178 }
00179
00180 float store;
00181 t1 = tim.get();
00182 for(int l = 0; l < loops; l++)
00183 {
00184 for(int k = 0; k < loops; k++)
00185 {
00186 store = 0.0f;
00187 for(int i = 0; i < large_samples; i++)
00188 {
00189 store += fastSqrt_Bab(FLA[i]);
00190 }
00191 }
00192 }
00193 t2 = tim.get();
00194 t3 = t2 - t1;
00195 LINFO(">>> Time for Log 2 fast Babylonian float SQRT - %d mcs (result %f)",t3,store);
00196 }
00197
00198 LINFO("<<<NEXT>>>");
00199
00200
00201 {
00202 LINFO("fastSqrt_Q3 : Quake 3 Fast Square Root - Float");
00203 const int samples = 7;
00204
00205 float A[samples];
00206 float F[samples];
00207 float N[samples];
00208
00209 A[0] = 1.0f;
00210 A[1] = 2.0f;
00211 A[2] = 8.0f;
00212 A[3] = 100.0f;
00213 A[4] = M_PI;
00214 A[5] = 100000;
00215 A[6] = 1.0f/3.0f;
00216
00217 for(int i = 0; i < samples; i++)
00218 {
00219 F[i] = fastSqrt_Q3(A[i]);
00220 N[i] = sqrt(A[i]);
00221 LINFO("\t%d SQRT %f - Fast %f Normal %f",i,A[i],F[i],N[i]);
00222 }
00223
00224 float store;
00225 t1 = tim.get();
00226 for(int l = 0; l < loops; l++)
00227 {
00228 for(int k = 0; k < loops; k++)
00229 {
00230 store = 0.0f;
00231 for(int i = 0; i < large_samples; i++)
00232 {
00233 store += fastSqrt_Q3(FLA[i]);
00234 }
00235 }
00236 }
00237 t2 = tim.get();
00238 t3 = t2 - t1;
00239 LINFO(">>> Time for fast float SQRT - %d mcs (result %f)",t3,store);
00240 }
00241
00242 LINFO("<<<NEXT>>>");
00243
00244
00245 {
00246 LINFO("fastSqrt_Bab_2 : Log 2 Babylonian 2 Approx Fast Square Root - Float");
00247 const int samples = 7;
00248
00249 float A[samples];
00250 float F[samples];
00251 float N[samples];
00252
00253 A[0] = 1.0f;
00254 A[1] = 2.0f;
00255 A[2] = 8.0f;
00256 A[3] = 100.0f;
00257 A[4] = M_PI;
00258 A[5] = 100000;
00259 A[6] = 1.0f/3.0f;
00260
00261 for(int i = 0; i < samples; i++)
00262 {
00263 F[i] = fastSqrt_Bab_2(A[i]);
00264 N[i] = sqrt(A[i]);
00265 LINFO("\t%d SQRT %f - Log 2 Fast Babylonian %f Normal %f",
00266 i,A[i],F[i],N[i]);
00267 }
00268
00269 float store;
00270 t1 = tim.get();
00271 for(int l = 0; l < loops; l++)
00272 {
00273 for(int k = 0; k < loops; k++)
00274 {
00275 store = 0.0f;
00276 for(int i = 0; i < large_samples; i++)
00277 {
00278 store += fastSqrt_Bab_2(FLA[i]);
00279 }
00280 }
00281 }
00282 t2 = tim.get();
00283 t3 = t2 - t1;
00284 LINFO(">>> Time for Log 2 fast Babylonian float SQRT - %d mcs (result %f)",t3,store);
00285 }
00286
00287 LINFO("<<<NEXT>>>");
00288
00289
00290 {
00291 LINFO("fastSqrt_2 : Log 2 Approx Fast Square Root - Double");
00292 const int samples = 7;
00293
00294 double A[samples];
00295 double F[samples];
00296 double N[samples];
00297
00298 A[0] = 1.0F;
00299 A[1] = 2.0F;
00300 A[2] = 8.0F;
00301 A[3] = 100.0F;
00302 A[4] = M_PI;
00303 A[5] = 100000;
00304 A[6] = 1.0F/3.0F;
00305
00306 for(int i = 0; i < samples; i++)
00307 {
00308 F[i] = fastSqrt_2(A[i]);
00309 N[i] = sqrt(A[i]);
00310 LINFO("\t%d SQRT %f - Fast %f Normal %f",i,A[i],F[i],N[i]);
00311 }
00312
00313 double store;
00314 t1 = tim.get();
00315 for(int l = 0; l < loops; l++)
00316 {
00317 for(int k = 0; k < loops; k++)
00318 {
00319 store = 0.0F;
00320 for(int i = 0; i < large_samples; i++)
00321 {
00322 store += fastSqrt_2(DLA[i]);
00323 }
00324 }
00325 }
00326 t2 = tim.get();
00327 t3 = t2 - t1;
00328 LINFO(">>> Time for fast double SQRT - %d mcs (result %f)",t3,store);
00329 }
00330
00331 LINFO("<<<NEXT>>>");
00332
00333
00334 {
00335 LINFO("fastSqrt_Bab : Log 2 Babylonian Approx Fast Square Root - Double");
00336 const int samples = 7;
00337
00338 double A[samples];
00339 double F[samples];
00340 double N[samples];
00341
00342 A[0] = 1.0f;
00343 A[1] = 2.0f;
00344 A[2] = 8.0f;
00345 A[3] = 100.0f;
00346 A[4] = M_PI;
00347 A[5] = 100000;
00348 A[6] = 1.0f/3.0f;
00349
00350 for(int i = 0; i < samples; i++)
00351 {
00352 F[i] = fastSqrt_Bab(A[i]);
00353 N[i] = sqrt(A[i]);
00354 LINFO("\t%d SQRT %f - Log 2 Fast Babylonian %f Normal %f",
00355 i,A[i],F[i],N[i]);
00356 }
00357
00358 double store;
00359 t1 = tim.get();
00360 for(int l = 0; l < loops; l++)
00361 {
00362 for(int k = 0; k < loops; k++)
00363 {
00364 store = 0.0f;
00365 for(int i = 0; i < large_samples; i++)
00366 {
00367 store += fastSqrt_Bab(DLA[i]);
00368 }
00369 }
00370 }
00371 t2 = tim.get();
00372 t3 = t2 - t1;
00373 LINFO(">>> Time for Log 2 fast Babylonian double SQRT - %d mcs (result %f)",t3,store);
00374 }
00375
00376 LINFO("<<<NEXT>>>");
00377
00378
00379 {
00380 LINFO("fastSqrt_Q3 : Quake 3 Fast Square Root - Double");
00381 const int samples = 7;
00382
00383 double A[samples];
00384 double F[samples];
00385 double N[samples];
00386
00387 A[0] = 1.0F;
00388 A[1] = 2.0F;
00389 A[2] = 8.0F;
00390 A[3] = 100.0F;
00391 A[4] = M_PI;
00392 A[5] = 100000;
00393 A[6] = 1.0F/3.0F;
00394
00395 for(int i = 0; i < samples; i++)
00396 {
00397 F[i] = fastSqrt_Q3(A[i]);
00398 N[i] = sqrt(A[i]);
00399 LINFO("\t%d SQRT %f - Fast %f Normal %f",i,A[i],F[i],N[i]);
00400 }
00401
00402 double store;
00403 t1 = tim.get();
00404 for(int l = 0; l < loops; l++)
00405 {
00406 for(int k = 0; k < loops; k++)
00407 {
00408 store = 0.0F;
00409 for(int i = 0; i < large_samples; i++)
00410 {
00411 store += fastSqrt_Q3(DLA[i]);
00412 }
00413 }
00414 }
00415 t2 = tim.get();
00416 t3 = t2 - t1;
00417 LINFO(">>> Time for fast double SQRT - %d mcs (result %f)",t3,store);
00418 }
00419 LINFO("<<<NEXT>>>");
00420
00421
00422 {
00423 LINFO("fastSqrt_Bab_2 : Log 2 Babylonian 2 Approx Fast Square Root - double");
00424 const int samples = 7;
00425
00426 double A[samples];
00427 double F[samples];
00428 double N[samples];
00429
00430 A[0] = 1.0f;
00431 A[1] = 2.0f;
00432 A[2] = 8.0f;
00433 A[3] = 100.0f;
00434 A[4] = M_PI;
00435 A[5] = 100000;
00436 A[6] = 1.0f/3.0f;
00437
00438 for(int i = 0; i < samples; i++)
00439 {
00440 F[i] = fastSqrt_Bab_2(A[i]);
00441 N[i] = sqrt(A[i]);
00442 LINFO("\t%d SQRT %f - Log 2 Fast Babylonian %f Normal %f",
00443 i,A[i],F[i],N[i]);
00444 }
00445
00446 double store;
00447 t1 = tim.get();
00448 for(int l = 0; l < loops; l++)
00449 {
00450 for(int k = 0; k < loops; k++)
00451 {
00452 store = 0.0f;
00453 for(int i = 0; i < large_samples; i++)
00454 {
00455 store += fastSqrt_Bab_2(DLA[i]);
00456 }
00457 }
00458 }
00459 t2 = tim.get();
00460 t3 = t2 - t1;
00461 LINFO(">>> Time for Log 2 fast Babylonian float SQRT - %d mcs (result %f)",t3,store);
00462 }
00463
00464
00465 {
00466 LINFO("fastLog : Fast Log - double");
00467 const int samples = 7;
00468
00469 double A[samples];
00470 double F[samples];
00471 double N[samples];
00472
00473 A[0] = 1.0f;
00474 A[1] = 2.0f;
00475 A[2] = 8.0f;
00476 A[3] = 100.0f;
00477 A[4] = M_PI;
00478 A[5] = 100000;
00479 A[6] = 1.0f/3.0f;
00480
00481 for(int i = 0; i < samples; i++)
00482 {
00483 F[i] = fastLog(A[i]);
00484 N[i] = log(A[i]);
00485 LINFO("\t%d Log %f - Fast Log %f Normal %f",
00486 i,A[i],F[i],N[i]);
00487 }
00488
00489 double store;
00490 t1 = tim.get();
00491 for(int l = 0; l < loops; l++)
00492 {
00493 for(int k = 0; k < loops; k++)
00494 {
00495 store = 0.0f;
00496 for(int i = 0; i < large_samples; i++)
00497 {
00498 store += fastLog(DLA[i]);
00499 }
00500 }
00501 }
00502 t2 = tim.get();
00503 t3 = t2 - t1;
00504 LINFO(">>> Time for fastLog - %d mcs (result %f)",t3,store);
00505 }
00506
00507
00508
00509 LINFO("<<<NEXT - CHECKING IMPLEMENTATION>>>");
00510 {
00511 int store;
00512 t1 = tim.get();
00513 for(int l = 0; l < loops; l++)
00514 {
00515 for(int k = 0; k < loops; k++)
00516 {
00517 store = 0;
00518 for(int i = 0; i < large_samples; i++)
00519 {
00520 store += (int)sqrt(ILA[i]);
00521 }
00522 }
00523 }
00524 t2 = tim.get();
00525 t3 = t2 - t1;
00526 LINFO(">>> Time Int SQRT BASELINE - %d mcs (result %d)",t3,store);
00527 }
00528
00529 {
00530 int store;
00531 t1 = tim.get();
00532 for(int l = 0; l < loops; l++)
00533 {
00534 for(int k = 0; k < loops; k++)
00535 {
00536 store = 0;
00537 for(int i = 0; i < large_samples; i++)
00538 {
00539 store += fastSqrt(ILA[i]);
00540 }
00541 }
00542 }
00543 t2 = tim.get();
00544 t3 = t2 - t1;
00545 LINFO(">>> Time Int SQRT - %d mcs (result %d)",t3,store);
00546 }
00547
00548 {
00549 float store;
00550 t1 = tim.get();
00551 for(int l = 0; l < loops; l++)
00552 {
00553 for(int k = 0; k < loops; k++)
00554 {
00555 store = 0.0f;
00556 for(int i = 0; i < large_samples; i++)
00557 {
00558 store += sqrt(FLA[i]);
00559 }
00560 }
00561 }
00562 t2 = tim.get();
00563 t3 = t2 - t1;
00564 LINFO(">>> Time Float SQRT BASELINE - %d mcs (result %f)",t3,store);
00565 }
00566
00567 {
00568 float store;
00569 t1 = tim.get();
00570 for(int l = 0; l < loops; l++)
00571 {
00572 for(int k = 0; k < loops; k++)
00573 {
00574 store = 0.0f;
00575 for(int i = 0; i < large_samples; i++)
00576 {
00577 store += fastSqrt(FLA[i]);
00578 }
00579 }
00580 }
00581 t2 = tim.get();
00582 t3 = t2 - t1;
00583 LINFO(">>> Time Float SQRT - %d mcs (result %f)",t3,store);
00584 }
00585
00586 {
00587 double store;
00588 t1 = tim.get();
00589 for(int l = 0; l < loops; l++)
00590 {
00591 for(int k = 0; k < loops; k++)
00592 {
00593 store = 0.0f;
00594 for(int i = 0; i < large_samples; i++)
00595 {
00596 store += log(DLA[i]);
00597 }
00598 }
00599 }
00600 t2 = tim.get();
00601 t3 = t2 - t1;
00602 LINFO(">>> Time Log BASELINE - %d mcs (result %f)",t3,store);
00603 }
00604
00605 {
00606 double store;
00607 t1 = tim.get();
00608 for(int l = 0; l < loops; l++)
00609 {
00610 for(int k = 0; k < loops; k++)
00611 {
00612 store = 0.0f;
00613 for(int i = 0; i < large_samples; i++)
00614 {
00615 store += fastLog(DLA[i]);
00616 }
00617 }
00618 }
00619 t2 = tim.get();
00620 t3 = t2 - t1;
00621 LINFO(">>> Time FastLog - %d mcs (result %f)",t3,store);
00622 }
00623 return 1;
00624 }
00625