# [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.

change

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 5. serial - tail recursion - decrement index
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
calc_pi(serial_decr,N) ->
calc_pi1(N,1/N,0);

and

calc_pi1(0,Step,Sum) -> Step*Sum;
calc_pi1(I,Step,Sum) ->
X=Step*(I-0.5),
V=4.0/(1.0+X*X),
calc_pi1(I-1,Step,Sum+V).

to

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.

Jeff.

```