how to generate pi in c
Ian Smith
smithi at nimnet.asn.au
Wed Nov 10 04:43:52 UTC 2010
On Tue, 9 Nov 2010, perryh at pluto.rain.com wrote:
> Ian Smith <smithi at nimnet.asn.au> wrote:
> > 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 :)
>
> The part I snipped out included a note that it was only generating
> the digits, not trying to show the decimal point placed properly.
Ah.
> With that understanding, and as long as max is a (large-ish) power
> of 10, the division is not needed. (If the division were to be
> inserted, at least one of its operands would need to be cast to
> double, or pi would likely be reported as 3.0000 due to truncation.)
Ok, you can probably tell that I'm not really proficient in C; as an old
Pascal programmer I'd have assumed an implied cast to pi's type, though
I'd likely have specified 4.0 to make it clear.
> An approach more in keeping with the original would involve using
> sprintf, and then inserting the decimal point into the resulting
> string :)
It's a bit O(N) to use for many digits .. still I like the approach.
cheers, Ian
More information about the freebsd-questions
mailing list