fuchsia / third_party / llvm-test-suite / refs/heads/upstream/ggreif/CallInst-operands / . / MultiSource / Benchmarks / SciMark2-C / MonteCarlo.c

#include "Random.h" | |

/** | |

Estimate Pi by approximating the area of a circle. | |

How: generate N random numbers in the unit square, (0,0) to (1,1) | |

and see how are within a radius of 1 or less, i.e. | |

<pre> | |

sqrt(x^2 + y^2) < r | |

</pre> | |

since the radius is 1.0, we can square both sides | |

and avoid a sqrt() computation: | |

<pre> | |

x^2 + y^2 <= 1.0 | |

</pre> | |

this area under the curve is (Pi * r^2)/ 4.0, | |

and the area of the unit of square is 1.0, | |

so Pi can be approximated by | |

<pre> | |

# points with x^2+y^2 < 1 | |

Pi =~ -------------------------- * 4.0 | |

total # points | |

</pre> | |

*/ | |

static const int SEED = 113; | |

double MonteCarlo_num_flops(int Num_samples) | |

{ | |

/* 3 flops in x^2+y^2 and 1 flop in random routine */ | |

return ((double) Num_samples)* 4.0; | |

} | |

double MonteCarlo_integrate(int Num_samples) | |

{ | |

Random R = new_Random_seed(SEED); | |

int under_curve = 0; | |

int count; | |

for (count=0; count<Num_samples; count++) | |

{ | |

double x= Random_nextDouble(R); | |

double y= Random_nextDouble(R); | |

if ( x*x + y*y <= 1.0) | |

under_curve ++; | |

} | |

Random_delete(R); | |

return ((double) under_curve / Num_samples) * 4.0; | |

} | |