From owner-freebsd-questions@FreeBSD.ORG Wed Nov 10 04:43:52 2010 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D6C73106566B for ; Wed, 10 Nov 2010 04:43:52 +0000 (UTC) (envelope-from smithi@nimnet.asn.au) Received: from sola.nimnet.asn.au (paqi.nimnet.asn.au [115.70.110.159]) by mx1.freebsd.org (Postfix) with ESMTP id 4F7FC8FC13 for ; Wed, 10 Nov 2010 04:43:51 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by sola.nimnet.asn.au (8.14.2/8.14.2) with ESMTP id oAA4hoc2019941; Wed, 10 Nov 2010 15:43:50 +1100 (EST) (envelope-from smithi@nimnet.asn.au) Date: Wed, 10 Nov 2010 15:43:49 +1100 (EST) From: Ian Smith To: perryh@pluto.rain.com In-Reply-To: <4cd90fda.M0ZCOlvxcAzTnwuw%perryh@pluto.rain.com> Message-ID: <20101110152855.F76697@sola.nimnet.asn.au> References: <20101106120033.CB14610656D7@hub.freebsd.org> <20101108182717.M66572@sola.nimnet.asn.au> <4cd90fda.M0ZCOlvxcAzTnwuw%perryh@pluto.rain.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Cc: freebsd-questions@freebsd.org, gnrp@physik.tu-berlin.de Subject: Re: how to generate pi in c X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Nov 2010 04:43:52 -0000 On Tue, 9 Nov 2010, perryh@pluto.rain.com wrote: > Ian Smith wrote: > > In freebsd-questions Digest, Vol 335, Issue 11, Message: 4 > > On Sat, 06 Nov 2010 01:00:34 -0700 perryh@pluto.rain.com wrote: > > > Julian Fagir wrote: > > > > > Does anyone has a "generate-pi.c" source code? > > > ... > > > > 1 #include > > > > 2 #include > > > > 3 #include > > > > 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