home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / misc / posbb / src / amigaos / math.c < prev    next >
C/C++ Source or Header  |  1998-05-09  |  7KB  |  267 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos/dos.h>
  4. #include <exec/types.h>
  5. #include <exec/memory.h>
  6. #include <devices/timer.h>
  7. #include <math.h>
  8. #include "compiler.h"
  9.  
  10. /****** posbb_tests.c/Test_IMath ********************************************
  11. *
  12. *   NAME
  13. *     Test_IMath -- Tests the speed of some int Math operations.
  14. *
  15. *   SYNOPSIS
  16. *     time = Test_IMath( int precision )
  17. *     ULONG Test_IMath( int );
  18. *
  19. *   FUNCTION
  20. *     Does 1 million of additions,differences,multiplications and divisions
  21. *     and returns the time it took.
  22. *
  23. *   INPUT
  24. *     int precision     the precision of the results. Can be any of
  25. *                       POSBB_PREECISION#?. The higher is the precision wanted,
  26. *                       the higher the time taken. precision is useful on faster
  27. *                       machines,on wich the times will be too low.
  28. *
  29. *   RESULT
  30. *     time - Time spent in seconds. No error can be returned.
  31. *
  32. *   EXAMPLE
  33. *     See posbb.c/Perform_Tests()
  34. *
  35. *   BUGS
  36. *
  37. *     Like some other function it uses if (freeze == TRUE) Forbid()/if (freeze == TRUE) Permit(),wich probably will
  38. *     not work under a future Amiga OS.
  39. *     It doesn't check if memory allocations fail. In that case it will
  40. *     probably crash. I'll fix it in future versions.
  41. *
  42. ****************************************************************************
  43. */
  44. ULONG Test_IMath( precision,freeze,mt )
  45. int precision;
  46. BOOL freeze,mt;
  47. {
  48.   int c,i=0,time;
  49.   ULONG *a=0,*b=0,*d=0,secs;
  50.   struct timeval *time1,*time2;
  51.   char tmpstr[20];
  52.   time1 = (struct timeval *) POSBB_AllocMem(sizeof(struct timeval),0);
  53.   time2 = (struct timeval *) POSBB_AllocMem(sizeof(struct timeval),0);
  54.  
  55.   a = calloc(sizeof(ULONG),100*precision);
  56.   b = calloc(sizeof(ULONG),100*precision);
  57.   d = calloc(sizeof(ULONG),100*precision);
  58.   /* Initializing b and d table with random values */
  59.   for(i =0;i<(100*precision);i++)
  60.   {
  61.     b[i] = rand();
  62.     d[i] = rand();
  63.   }
  64. #ifndef NOFORBID
  65.   if (freeze == TRUE) Forbid();
  66. #endif
  67.   if (mt)
  68.   {
  69.     printf("Press RETURN to start");
  70.     getchar();
  71.   }
  72.   else  GetSysTime(time1);   /* This gets the system time using timer.device. It is opened by posbb.c */
  73.  
  74.   for (c = 0;c<10000;c++)
  75.   {
  76.     for ( i = 0; i<(100 * precision)-3; i+=3 )
  77.     {
  78.       a[i] /= b[i] + d[i];
  79.       a[i+1] *= b[i+1] - d[i+1];
  80.       a[i+2] += b[i+2] * d[i+2];
  81.       a[i+3] -= b[i+3] / d[i+3];
  82.     }
  83.   }
  84. if (mt)
  85.     {
  86.       DisplayBeep();
  87.       printf("Test finished. Type in the number of seconds taken:");
  88.       secs = atoi(gets(tmpstr));
  89.     }
  90.     else GetSysTime(time2);
  91. #ifndef NOFORBID
  92.   if (freeze == TRUE) Permit();
  93. #endif
  94.   free(a);
  95.   free(b);
  96.   free(d);
  97.   if (mt) time = secs * 1000;
  98.   else
  99.   {
  100.     SubTime(time2,time1);
  101.     time = (time2->tv_secs)*1000+(time2->tv_micro)/1000;
  102.   }
  103.   POSBB_FreeMem(time1,sizeof(struct timeval));
  104.   POSBB_FreeMem(time2,sizeof(struct timeval));
  105.   return time;
  106. }
  107. /****** posbb_tests.c/Test_FPMath ********************************************
  108. *
  109. *   NAME
  110. *     Test_FPMath -- Tests the speed of some floating point Math operations.
  111. *
  112. *   SYNOPSIS
  113. *     time = Test_FPMath( int precision )
  114. *     ULONG Test_FPMath( int );
  115. *
  116. *   FUNCTION
  117. *     Does 1 million of additions,differences,multiplications and divisions
  118. *     and returns the time it took.
  119. *
  120. *   INPUT
  121. *     int precision     the precision of the results. Can be any of
  122. *                       POSBB_PREECISION#?. The higher is the precision wanted,
  123. *                       the higher the time taken. precision is useful on faster
  124. *                       machines,on wich the times will be too low.
  125. *
  126. *   RESULT
  127. *     time - Time spent in seconds. At the moment no error can be returned.
  128. *
  129. *   EXAMPLE
  130. *     See posbb.c/Perform_Tests()
  131. *
  132. *   NOTES
  133. *     To obtain code for FPU use the right option of your compiler.
  134. *
  135. *   BUGS
  136. *     Like some other functions it uses if (freeze == TRUE) Forbid()/if (freeze == TRUE) Permit(),wich probably will
  137. *     not work under a future Amiga OS.
  138. *     Until now it doesn't check if memory allocations needed for variuos
  139. *     tables used in the test has failed. In that case it will probably
  140. *     crash. I'll fix it in new versions.
  141. *
  142. ****************************************************************************
  143. */
  144. ULONG Test_FPMath( precision ,freeze,mt)
  145. int precision;
  146. BOOL freeze,mt;
  147. {
  148.   int c,i=0;
  149.   ULONG secs,time;
  150.   double *a=0,*b,*d;
  151.   struct timeval *time1,*time2;
  152.   char tmpstr[20];
  153.   time1 = (struct timeval *) POSBB_AllocMem(sizeof(struct timeval),0);
  154.   time2 = (struct timeval *) POSBB_AllocMem(sizeof(struct timeval),0);
  155.  
  156.   a = calloc(sizeof(double),100*precision);
  157.   b = calloc(sizeof(double),100*precision);
  158.   d = calloc(sizeof(double),100*precision);
  159.   /* Initializing b and d table with random values; */
  160.   for(c =0;c<(100*precision);c++) {
  161.     b[c] = (double) rand();
  162.     d[c] = (double) rand();
  163.   }
  164. #ifndef NOFORBID
  165.   if (freeze == TRUE) Forbid();
  166. #endif
  167.   if (mt)
  168.   {
  169.     printf("Press RETURN to start");
  170.     getchar();
  171.   }
  172.   else  GetSysTime(time1);   /* This gets the system time using timer.device. It is opened by posbb.c */
  173.  
  174.   for (c = 0;c<10000;c++)
  175.   {
  176.     for ( i = 0; i<(100 * precision)-3; i+=3 )
  177.     {
  178.       a[i] /= b[i] + d[i];
  179.       a[i+1] *= b[i+1] - d[i+1];
  180.       a[i+2] += b[i+2] * d[i+2];
  181.       a[i+3] -= b[i+3] / d[i+3];
  182.     }
  183.   }
  184. #ifndef NOFORBID
  185.   if (freeze == TRUE) Permit();
  186. #endif
  187. if (mt)
  188.     {
  189.       DisplayBeep();
  190.       printf("Test finished. Type in the number of seconds taken:");
  191.       secs = atoi(gets(tmpstr));
  192.     }
  193.     else GetSysTime(time2);
  194.   free(a);
  195.   free(b);
  196.   free(d);
  197.   if (mt) time = secs * 1000;
  198.   else
  199.   {
  200.     SubTime(time2,time1);
  201.     time = (time2->tv_secs)*1000+(time2->tv_micro)/1000;
  202.   }
  203.   POSBB_FreeMem(time1,sizeof(struct timeval));
  204.   POSBB_FreeMem(time2,sizeof(struct timeval));
  205.  
  206.   return time;
  207.  
  208. }
  209. ULONG Test_TMath(precision,freeze,mt)
  210. int precision;
  211. BOOL freeze,mt;
  212. {
  213.   struct timeval *time1,*time2;
  214.   int c;
  215.   char tmpstr[20];
  216.   ULONG time,secs;
  217.   double *cosine=0,*sine=0,*tangent=0,angle = 0;
  218.   time1 = (struct timeval *) POSBB_AllocMem(sizeof(struct timeval),0);
  219.   time2 = (struct timeval *) POSBB_AllocMem(sizeof(struct timeval),0);
  220.   cosine = calloc(sizeof(double),360*precision);
  221.   sine = calloc(sizeof(double),360*precision);
  222.   tangent = calloc(sizeof(double),360*precision);
  223. #ifndef NOFORBID
  224.   if (freeze == TRUE) Forbid();
  225. #endif
  226.   if (mt)
  227.   {
  228.     printf("Press RETURN to start");
  229.     getchar();
  230.   }
  231.   else  GetSysTime(time1);   /* This gets the system time using timer.device. It is opened by posbb.c */
  232.   for(c=0;c<100;c++){
  233.     for(angle=0;angle<360*precision;angle++)
  234.     {
  235.       sine[(int)angle] = sin(angle);
  236.       cosine[(int)angle] = cos(angle);
  237.       tangent[(int)angle] = tan(angle);
  238.     }
  239.   }
  240.  if (mt)
  241.     {
  242.       DisplayBeep();
  243.       printf("Test finished. Type in the number of seconds taken:");
  244.       secs = atoi(gets(tmpstr));
  245.     }
  246.     else GetSysTime(time2);
  247. #ifndef NOFORBID
  248.   if (freeze == TRUE) Permit();
  249. #endif
  250.   free(sine);
  251.   free(cosine);
  252.   free(tangent);
  253.   if (mt) time = secs * 1000;
  254.   else
  255.   {
  256.     SubTime(time2,time1);
  257.     time = (time2->tv_secs)*1000+(time2->tv_micro)/1000;
  258.   }
  259.   POSBB_FreeMem(time1,sizeof(struct timeval));
  260.   POSBB_FreeMem(time2,sizeof(struct timeval));
  261.   return (time);
  262. }
  263.  
  264.  
  265.  
  266.  
  267.