Listing 8: Tests performance of summation methods


int main(void)
{
  float flt_arr[ARR_SIZE];
  double dbl_arr[ARR_SIZE];
  double val;
  double x;
  int j, k;
  long i;

  /* seed random number generator from time */
  srand((unsigned int)time(0));

  /* initialize arrays for test 1: uniform random 0.0 - 1.0 */

  printf("\n%s     Simple      Extended"
         "    Sorted      Pairwise    Kahan\n", "Unif 0-1   ");
  for (j = 0; j < OUTER_ITER; j++)
  {
    for (i = 0; i < ARR_SIZE; i++)
      flt_arr[i] = dbl_arr[i] = 
          (  rand()*(double)RAND_MAX*RAND_MAX*(double)RAND_MAX
           + rand()*(double)RAND_MAX*RAND_MAX
           + rand()*(double)RAND_MAX
           + rand())
          /
          (  RAND_MAX*(double)RAND_MAX*RAND_MAX*(double)RAND_MAX
           + RAND_MAX*(double)RAND_MAX*RAND_MAX
           + RAND_MAX*(double)RAND_MAX
           + RAND_MAX);

    loop(flt_arr, dbl_arr, "Unif 0-1   ");
  }
  print_and_reset_minmaxerr();

  /* reinitialize for test 2: uniform random -1.0 - 1.0 */
  printf("\n%s     Simple      Extended"
         "    Sorted      Pairwise    Kahan\n", "Unif -1-1  ");
  for (j = 0; j < OUTER_ITER; j++)
  {
    for (i = 0; i < ARR_SIZE; i++)
      flt_arr[i] = dbl_arr[i] =
          (  rand()*(double)RAND_MAX*RAND_MAX*(double)RAND_MAX
           + rand()*(double)RAND_MAX*RAND_MAX
           + rand()*(double)RAND_MAX
           + rand()) * 2.0
          /
          (  RAND_MAX*(double)RAND_MAX*RAND_MAX*(double)RAND_MAX
           + RAND_MAX*(double)RAND_MAX*RAND_MAX
           + RAND_MAX*(double)RAND_MAX
           + RAND_MAX)
          - 1.0;

    loop(flt_arr, dbl_arr, "Unif -1-1  ");
  }
  print_and_reset_minmaxerr();

  /* reinitialize for test 3: more or less Gaussian */
  /*
   * Simple but not very accurate way to make a gaussian: just
   * sum lots (here 12) uniform random variables.
   */
  printf("\n%s     Simple      Extended"
         "    Sorted      Pairwise    Kahan\n", "Gaussian   ");
  for (j = 0; j < OUTER_ITER; j++)
  {
    for (i = 0; i < ARR_SIZE; i++)
    {
      val = 0.0;
      for (k = 0; k < 12; k++)
        val += rand();
      flt_arr[i] = dbl_arr[i] = val / (double)RAND_MAX - 6.0;
    }

    loop(flt_arr, dbl_arr, "Gaussian   ");
  }
  print_and_reset_minmaxerr();
  /* reinitialize for test 4:
   * numerical integration to calculate pi */
  /*
   * The area of a circle is pi * radius^2.  When the radius is
   * 1.0 the area is pi.  So we approximate pi as 4 times the
   * area of one quarter of the unit circle, and get the area
   * of that quadrant using numerical integration.
   */
  printf("\n%s     Simple      Extended"
         "    Sorted      Pairwise    Kahan\n", "Pi         ");
  for (j = 0; j < OUTER_ITER; j++)
  {
    for (i = 0; i < ARR_SIZE; i++)
    {
      x = (1 + 2 * i) / (double)(2 * ARR_SIZE);
      flt_arr[i] = dbl_arr[i] =
          sqrt(1.0 - x * x) * (4.0 / ARR_SIZE);

    loop(flt_arr, dbl_arr, "Pi         ");
  }
  print_and_reset_minmaxerr();

  /*
   * Omitted from listing: code to print times to nearest tenth
   * of a second
   * ...
   */

  return EXIT_SUCCESS;
}
/* End of File */