|
|
@ -21,24 +21,24 @@ int main(int argc, char *argv[]) {
|
|
|
|
|
|
|
|
|
|
|
|
srand(time(NULL) + mi_rank); // Ojo, tal vez un proceso se lanza un segundo después que otro y esta cuenta coincide.
|
|
|
|
srand(time(NULL) + mi_rank); // Ojo, tal vez un proceso se lanza un segundo después que otro y esta cuenta coincide.
|
|
|
|
|
|
|
|
|
|
|
|
size_t tiros = atol(argv[1]);
|
|
|
|
long tiros = atol(argv[1]);
|
|
|
|
tiros = tiros / num_procs * num_procs;
|
|
|
|
tiros = tiros / num_procs * num_procs;
|
|
|
|
|
|
|
|
|
|
|
|
size_t positivos_parciales = 0;
|
|
|
|
long positivos_parciales = 0;
|
|
|
|
for(size_t i = 0; i < tiros / num_procs; i++) {
|
|
|
|
for(long i = 0; i < tiros / num_procs; i++) {
|
|
|
|
double x = (double)random() / RAND_MAX;
|
|
|
|
double x = (double)rand() / RAND_MAX;
|
|
|
|
double y = (double)random() / RAND_MAX;
|
|
|
|
double y = (double)rand() / RAND_MAX;
|
|
|
|
if(x * x + y * y < 1)
|
|
|
|
if(x * x + y * y < 1)
|
|
|
|
positivos_parciales++;
|
|
|
|
positivos_parciales++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
size_t positivos;
|
|
|
|
long positivos;
|
|
|
|
MPI_Reduce(&positivos_parciales, &positivos, 1, MPI_LONG, MPI_SUM, 0, MPI_COMM_WORLD);
|
|
|
|
MPI_Reduce(&positivos_parciales, &positivos, 1, MPI_LONG, MPI_SUM, 0, MPI_COMM_WORLD);
|
|
|
|
|
|
|
|
|
|
|
|
if(! mi_rank) {
|
|
|
|
if(! mi_rank) {
|
|
|
|
double pi = 4.0 * positivos / tiros;
|
|
|
|
double pi = 4.0 * positivos / tiros;
|
|
|
|
|
|
|
|
|
|
|
|
printf("Tiros = %zd, Positivos = %zd\n", tiros, positivos);
|
|
|
|
printf("Tiros = %ld, Positivos = %ld\n", tiros, positivos);
|
|
|
|
printf("π ~= %.15f\n", pi);
|
|
|
|
printf("π ~= %.15f\n", pi);
|
|
|
|
printf("ε = %f%%\n", 100 * fabs(M_PI - pi) / M_PI);
|
|
|
|
printf("ε = %f%%\n", 100 * fabs(M_PI - pi) / M_PI);
|
|
|
|
}
|
|
|
|
}
|
|
|
|