# 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
```