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 */