// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. /// /// This is a port of the SciMark2a Java Benchmark to C# by /// Chris Re (cmr28@cornell.edu) and Werner Vogels (vogels@cs.cornell.edu) /// /// For details on the original authors see http://math.nist.gov/scimark2 /// /// This software is likely to burn your processor, bitflip your memory chips /// anihilate your screen and corrupt all your disks, so you it at your /// own risk. /// using System; namespace SciMark2 { /// 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. ///
  
    /// sqrt(x^2 + y^2) < r
    /// 
/// since the radius is 1.0, we can square both sides /// and avoid a sqrt() computation: ///
    /// x^2 + y^2 <= 1.0
    /// 
/// 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 ///
    /// # points with x^2+y^2 < 1
    /// Pi =~ 		--------------------------  * 4.0
    /// total # points
    /// 
///
public class MonteCarlo { internal const int SEED = 113; public static double num_flops(int Num_samples) { // 3 flops in x^2+y^2 and 1 flop in random routine return ((double)Num_samples) * 4.0; } public static double integrate(int Num_samples) { SciMark2.Random R = new SciMark2.Random(SEED); int under_curve = 0; for (int count = 0; count < Num_samples; count++) { double x = R.nextDouble(); double y = R.nextDouble(); if (x * x + y * y <= 1.0) under_curve++; } return ((double)under_curve / Num_samples) * 4.0; } } }