how to generate pi in c
Ian Smith
smithi at nimnet.asn.au
Mon Nov 8 09:01:24 UTC 2010
In freebsd-questions Digest, Vol 335, Issue 11, Message: 4
On Sat, 06 Nov 2010 01:00:34 -0700 perryh at pluto.rain.com wrote:
> Julian Fagir <gnrp at physik.tu-berlin.de> wrote:
> > > Does anyone has a "generate-pi.c" source code?
> ...
> > 1 #include <stdlib.h>
> > 2 #include <string.h>
> > 3 #include <stdio.h>
> > 4
> > 5 // Change this for a more accurate result.
> > 6 long max = 100000000;
> > 7 double a, b;
> > 8 double pi;
> > 9 long counter;
> > 10 long i;
> > 11
> > 12 int main() {
> > 13 for (i = 0; i< max; i++) {
> > 14 a = drand48();
> > 15 b = drand48();
> > 16 if (a*a + b*b <= 1)
> > 17 counter++;
> > 18 }
> > 19 pi = 4*counter;
Surely that should be 'pi = 4 * counter / max;' otherwise even if the
integer counter were only 1 (of 100000000), pi would already be 4 :)
> > 20
> > 21 printf("%e\n", pi);
> > 22 return(0);
> > 23 }
> ...
> > This approximation is stupid ... Just take 'random' numbers and
> > look whether they are in a circle (that's the a*a + b*b <= 1).
>
> Not stupid, clever. Very clever. I rather doubt it resembles what
> the OP had in mind, but it is a brilliant example of what can be
> accomplished when one casts aside any perceived need to adopt a
> conventional approach.
Agreed, quite elegant. Geometry being a bit rusty, I had to sketch it
to really see it as simply the ratio of the area of the first quadrant
of the unit circle (pi/4) to that of the unit square (1.0), times 4.
> > The detail of this approximation heavily depends on the pseudo-rng
> > you are using, as does its correctness
>
> Perhaps it would be useful in a PRNG test suite?
>
> > (e.g., when your 'rng' always returns 10, pi would be computed to
> > be 10) ...
>
> Bad example. If abs(drand48()) always exceeded (0.5 * sqrt(2.0)),
> a*a + b*b would always exceed 1.0, thus counter would never be
> incremented and pi would be reported as zero.
That'd be one pretty sad PRNG :) but testing variance of the above
algorithm's result to best known double pi is likely a useful test.
And while a square enclosing a circle, it's hardly squaring the circle:
http://en.wikipedia.org/wiki/Squaring_the_circle .. but an interesting
read nonetheless for unrequited seekers of pi-foo :)
cheers, Ian
More information about the freebsd-questions
mailing list