Code:
int main(int argc, char *argv[])
{
int digits = 25, dispdigits;
if (argc > 1) {
digits = atoi(argv[1]);
}
dispdigits = digits;
if (argc > 2) {
dispdigits = atoi(argv[2]);
}
blocks = (int) (digits / 9.632959861247397) + 5;
ul *pi = init();
timeBeginPeriod(1);
ul t = timeGetTime();
calc_pi(pi);
timeEndPeriod(1);
t = timeGetTime() - t;
ulprint(" pi = ", pi, dispdigits);
fprintf(stderr, "Time to calculate %d digits = %1.3f seconds\n",
digits, t * 0.001);
#ifndef NDEBUG
ul *pi_5 = init();
divmask = 0;
timeBeginPeriod(1);
t = timeGetTime();
calc_pi(pi);
timeEndPeriod(1);
t = timeGetTime() - t;
fprintf(stderr, "TDiv to calculate %d digits = %1.3f seconds\n",
digits, t * 0.001);
timeBeginPeriod(1);
t = timeGetTime();
calc_pi_5_239(pi_5);
timeEndPeriod(1);
t = timeGetTime() - t;
fprintf(stderr, "5/239 calculate %d digits = %1.3f seconds\n",
digits, t * 0.001);
if (memcmp(&pi[2], &pi_5[2], sizeof(ul)*(blocks-1))) {
fprintf(stderr,"Not equal results!\n");
ulprint("pi_5 = ", pi, dispdigits);
for (int i = blocks; (i >= 0) && (pi[i] != pi_5[i]); i--) ;
fprintf(stderr, "%d different blocks!\n", blocks - i);
}
else
fprintf(stderr, "All OK!\n");
free(pi_5);
fprintf(stderr,"divs = %u, muls = %u, adds = %u, subs = %u, maxdiv = %u\n",
divs, muls, adds, subs, maxdiv);
#endif
free(pi);
return 0;
}