/* Jonathan Leto */ /* Sat Feb 03 04:53:01 EST 2001 */ /* Approximate pi using Ramanujan I formula */ /* Compile: gcc -O3 -fomit-frame-pointer -Wall -lgmp ramanujan1.c -o ramanujan1 */ /* More info: http://leto.net/math/pi.html */ #include #include #include #include "gmp.h" #define DEF_NUM 50 // Default number of iterations #define UINT unsigned long int #define DEBUG 0 // Supposedly this formula gets 14 decimals per term, // this is the default precision, in bits #define PRECISION ((DEF_NUM*14*8)+1) // Formula constants #define K1 545140134 #define K2 13591409 #define K3 640320 #define K4 100100025 #define K5 327843840 #define K6 53360 void usage(char *s){ printf("usage: %s ITERATIONS PRECISION\n",s); exit(1); } int main (int argc, char **argv) { clock_t tv1, tv2; double time1=0,time2=0; mpf_t pi; // final result mpf_t term; // value of term mpf_t termsum; // value of all terms mpf_t tempf; // temp float mpz_t tempi,tempi2; // temp ints mpz_t termint; // integer part of term UINT i,num,prec_bits; num = (argc < 2) ? DEF_NUM : atoi(argv[1] ); prec_bits = (argc < 3 ) ? PRECISION : atoi(argv[2]); if( num < 1 || prec_bits < 1){ usage(argv[0]); } mpz_init(tempi); mpz_init(tempi2); mpz_init_set_ui(termint,(UINT) 1); mpf_set_default_prec(prec_bits); mpf_init(pi); mpf_init(term); mpf_init(termsum); mpf_init(tempf); tv1 = clock(); for(i=0;i