Categorias

Calcular PI (Monte Carlo)

Programa em C que calcula o valor Pi pelo método Monte Carlo, usando threads.

/*


* Tonho
* Realiza o calculo de pi pelo método de Monte Carlo
* usando threads

*/

#include 
#include 
#include 


#define NUMTHR 10  // Numero total de threads

int num_ptos [10]; // Total de pontos da thread 
int num_ptos_cir[10]; // Pontos no circulo


void *calcula (void *param); // sorteia e verifica os pontos pela thread 


int main (int argc, char *argv[]){

	int j;
	int i;
	double pi = 0;  // contem o valor de pi
	int totalp = 0; // total de pontos
	int totalc = 0; // pontos no circulo
	pthread_t tid[10];  // ID das threads


	// Para todas as threads      
	for (i = 0; i< NUMTHR ; i++){
	// cria a i-esima thread
	pthread_create (&tid[i], NULL, calcula, &i);
       }	

	// Para cada thread 
	for (i = 0; i< NUMTHR ; i++){
	// espera que as threads terminem
	pthread_join (tid[i], NULL);
       }	

      for (i = 0; i< NUMTHR ; i++){
          totalp += num_ptos[i];  // totalp = totalp + num_ptos[i]
          totalc += num_ptos_cir[i]; // totalc = totalp + num_ptos[i]
       }	


// Calcula o valor de pi e imprime na tela	
	pi = 4.0*(((double)totalc)/((double)totalp)); // transforma totalp
						      // e totalc em double
							
	printf("Valor de pi:%fn",pi);
}





void *calcula (void *param) {

	int i;
	int thrnum = *((int *)param); // O número da thread ()
	double x,y,quad;
	num_ptos[thrnum] = 0;
	num_ptos_cir[thrnum] = 0;

	for (i = 0; i<1000000; i++){

		x = drand48(); // sorteia um número de 0 a 1
		y = drand48(); // sorteia um número de 0 a 1
		quad = ((x*x) + (y*y));
		// Se a soma dos quadrados for menor que R = 1
		// então caiu no círculo		
		if (quad <= 1){
			num_ptos_cir[thrnum] ++; // conta pontos no círculo		
		}

		num_ptos[thrnum] ++; // incrementa os pontos totais da thread N (0 a 9)

		// A cada 10 mil iterações imprime na tela
                if (i%10000==0)
                        printf("thread: %i n",thrnum);
	}

	// Imprime na tela a qtde de pontos no círculo
	// e no total de cada thread 
	printf ("Circ t%i:%dn",thrnum,num_ptos_cir[thrnum]);
	printf ("Total t%i:%dn",thrnum,num_ptos[thrnum]);	
	pthread_exit(0);
}