[erlang-questions] how: big float aithmetics (was PI calculation)
Zvi
<>
Thu Apr 3 01:31:14 CEST 2008
Jeff,
thank you for the solution. But I think, that mixing big integers with
floats limits precision by the float.
The more generic approach is to represent "big floats" using tuples, like
{BigInt, Exponent}.
I think it works, but I have trouble to implement division using integer
"div" operator:
%% big float arithmetics
plus({F1,E},{F2,E}) -> {F1+F2,E};
plus({F1,E1},{F2,E2}) ->
case E1<E2 of
true -> {F1+F2*pow10(E2-E1), E1};
false -> {F1*pow10(E1-E2)+F2, E2}
end.
minus({F1,E1},{F2,E2}) -> plus({F1,E1},{-F2,E2}).
multiply({F1,E1},{F2,E2}) -> {F1*F2,E1+E2}.
divide({F,E},{F,E}) -> {1,0};
divide({F1,E1},{F2,E2}) ->
N1 = round(math:log10(F1)),
N2 = round(math:log10(F2)),
N = 2*(N1+N2), %% increase the precision?
{F1*pow10(N) div F2, E1-E2-N}.
%% maybe we need to scale down precision?
pow10(N) ->
pow10(N,1).
pow10(0,Acc) -> Acc;
pow10(N,Acc) ->
pow10(N-1,Acc*10).
jm-13 wrote:
>
> Zvi wrote:
>
>
> 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.
> _______________________________________________
> erlang-questions mailing list
>
> http://www.erlang.org/mailman/listinfo/erlang-questions
>
>
--
View this message in context: http://www.nabble.com/Calculate-PI-in-Erlang-faster-than-in-Matlab-tp16440056p16454022.html
Sent from the Erlang Questions mailing list archive at Nabble.com.
More information about the erlang-questions
mailing list