// gcc -O3 -o pi pi.c #include #include #include #include #include #include #include #include #define MAX_HEXDIG 15 // maximum number of hexadecimal digits allowed #define MAX_PR 8 // maximum number or processes allowed int digits=2; int procs=1; long long unsigned int t; // fator de escala para o valor 1 long long unsigned int iter; // numero de iteracoes // calcula pi segundo Leibniz usando n digitos fracionarios hexadecimais" long long unsigned int pi(long long unsigned int a) { // argumento: valor inicial do denomidar na sequencia long long unsigned int m, // valor 4, ja com fator de escala d, // difference to next value of pi p=0; // o resultado, em escala de n digitos hexadecimais int b; // incremento para a m=4*t; b=4*procs; while(1) { d = m/a - m/(a+2); // dois elementos da sequencia de Leibniz if(d==0) break; // termine quando pi nao varia mais de uma rodada para a proxima p = p + d; a = a+b; } iter = a/b; return p; } static struct { long long unsigned int pi, iter; } *pr; // parts of pi and iter int main(int argc, char *argv[]) { static long long int p; // resultado struct timeval start_time, end_time; double run_time; int i; // para os lacos for char p_exact[] = "3.243F6A8885A308D313"; char p_str[MAX_HEXDIG+3]; // resultado na forma de string if(argc>1) digits = atoi(argv[1]); if(digits<1 || digits>MAX_HEXDIG) { fprintf(stderr,"Can use at most %d digits, not %d\n.", MAX_HEXDIG, digits); exit(1); } t=(long long unsigned int)1<<(4*digits); if(argc>2) procs = atoi(argv[2]); if(procs<1 || procs>MAX_PR) { fprintf(stderr,"Can use launch most %d processes, not %d\n.", MAX_PR, procs); exit(1); } pr = mmap(NULL, (MAX_PR-1)*(sizeof *pr), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); gettimeofday(&start_time, NULL); for(i=0; i1) printf(", %d iteracoes em parallelo\n", procs); else printf("\n"); return 0; }