[erlang-questions] Calculate PI in Erlang faster than in Matlab

jm <>
Wed Apr 2 07:42:13 CEST 2008

Zvi wrote:

> If anyone can improve parallel version not only in speed, but also in making
> it clear, so it will be fitting presentation / textbook style.
> Also, I want to modify HOF samples to use plists module.
> If anyone can give me pointers, how modify this example to use big integer
> arithmetics, i.e. to calculate first N digits of PI.

Here's an example of how to do fixed point arithmatic.


%% 5. serial - tail recursion - decrement index
calc_pi(serial_decr,N) ->


calc_pi1(0,Step,Sum) -> Step*Sum;
calc_pi1(I,Step,Sum) ->


calc_pi_fixedpoint(serial_decr, N, DecimalPlaces) ->
         calc_pi1(N, 1/N, 0, math:pow(10,DecimalPlaces));

calc_pi1(0, Step, Sum, _Numerator) -> 4*Sum div round(1/Step);
calc_pi1(I, Step, Sum, Numerator) ->
%%      io:format("I ~p Step ~p Sum ~p Numerator ~p~n",
%%                [I, Step, Sum, Numerator]),
         X = Step*(I-0.5),
         V = round(Numerator / (1.0+X*X)), %% integer by rounding
         calc_pi1(I-1, Step, Sum+V, Numerator).

There may be better ways of course. I'll leave converting the rest as an 
exercise :-).

Would you care to add a distributed (multi node) example as well?

The other thought I had was that instead of just having N recursive 
calls add a tolerance, Epsilon, which will stop the evaluation when two 
calls differ by less than Epsilon.


More information about the erlang-questions mailing list