On Fri, 2015-09-25 at 06:02 +0000, Nicholas Wilson via Digitalmars-d -learn wrote: > On Friday, 25 September 2015 at 05:50:58 UTC, Charanjit Singh > wrote: > > import std.stdio; > > import std.math; > > void main() > > > > { > > float sum,pi,t; > > int n=1; > > sum=0; > > while (n<100 ) > > { > > t=1/( n*n); > > n=n+1; > > sum=sum+t; > > > > > > } > > writeln("value of PI= " , (sum*6)^^.5); > > that is pi program as > > (pi^2)/6= 1/1+ 1/4 + 1/9 + 1/16 + 1/25 > > but output of my program is 2.44
This looks a bit like K&R C transliterated to D. Much better to write more idiomatic D… > t=1/( n*n); //<---- > Is doing integer division so is zero for n > 1 hence sqrt(1*6) = > 2.449... > > change that to a > t=1.0/( n*n); That certainly solves the immediate problem. Taking the original code and making it more D-like, you get something like: double while_loop() { auto n = 1; auto sum = 0.0; while (n < 100) { sum += 1.0 / (n * n); n++; } return sum; } but this is bounded iteration not unbounded iteration, so let us use a far more idiomatic form: double foreach_loop() { auto sum = 0.0; foreach (n; 1..100) { sum += 1.0 / (n * n); } return sum; } but this is still very explicit iteration and we have moved on to the era of implicit iteration and declarative rather than imperative expression: double reduce_loop() { return reduce!"1.0 / (a * a)"(iota(1, 100)); } Unfortunately I have clearly done something silly here as: double take_root(double x) { return (x * 6)^^0.5; } void main() { writeln("while = " , take_root(while_loop())); writeln("foreach = " , take_root(foreach_loop())); writeln("reduce = " , take_root(reduce_loop())); } results in: while = 3.13198 foreach = 3.13198 reduce = 2.44949 If we worry about the string form and instead try: double reduce_string_loop() { return reduce!"1.0 / (a * a)"(iota(1, 100)); } double reduce_function_loop() { return reduce!((n) => 1.0 / (n * n))(iota(1, 100)); } then we end up with: /usr/include/dmd/phobos/std/algorithm/iteration.d(2565): Error: template pi_sumInverseSquares.reduce_function_loop.__lambda1 cannot deduce function from argument types !()(int, int), candidates are: pi_sumInverseSquares.d(28): pi_sumInverseSquares.reduce_function_loop.__lambda1 /usr/include/dmd/phobos/std/meta.d(546): Error: template instance pi_sumInverseSquares.reduce_function_loop.F!(__lambda1) error instantiating /usr/include/dmd/phobos/std/algorithm/iteration.d(2473): instantiated from here: staticMap!(ReduceSeedType, __lambda1) pi_sumInverseSquares.d(28): instantiated from here: reduce!(Result) pi_sumInverseSquares.d(28): Error: template std.algorithm.iteration.reduce cannot deduce function from argument types !((n) => 1.00000 / (n * n))(Result), candidates are: /usr/include/dmd/phobos/std/algorithm/iteration.d(2447): std.algorithm.iteration.reduce(fun...) if (fun.length >= 1) Failed: ["dmd", "-v", "-o-", "pi_sumInverseSquares.d", "-I."] which is sort of annoying. -- Russel. ============================================================================= Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.win...@ekiga.net 41 Buckmaster Road m: +44 7770 465 077 xmpp: rus...@winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
signature.asc
Description: This is a digitally signed message part