54d2fecee0
- Added implementations for: bash, brainfuck, c, cpp, crystal, csharp, d, dart, elixir, erlang, fortran, go, haskell, java, javascript, julia, kotlin, objective-c, scala, typescript, lua, nim, odin, perl, php, python, r, ruby, rust, swift, zig, assembly, vimscript, wolfram - All implementations use Machin's formula: π/4 = 4*arctan(1/5) - arctan(1/239) - Build system with ./build.sh, test system with ./test.sh - Performance testing with ./run_all.sh - Comprehensive README.md explaining performance differences - Test framework verifies correctness against known π values
64 lines
2.0 KiB
Erlang
64 lines
2.0 KiB
Erlang
-module(print_hej).
|
|
-export([main/1, pow/2]).
|
|
|
|
main(Args) ->
|
|
Decimals = case Args of
|
|
[] -> 100;
|
|
[X | _] ->
|
|
case string:to_integer(X) of
|
|
{D, _} when D > 0 -> D;
|
|
_ -> 100
|
|
end
|
|
end,
|
|
|
|
Pi = calculate_pi(Decimals),
|
|
PiStr = format_pi(Pi, Decimals),
|
|
io:format("~s~n", [PiStr]),
|
|
erlang:halt(0).
|
|
|
|
% Calculate arctan(1/x) using Taylor series
|
|
% arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ...
|
|
arctan(X, Decimals) ->
|
|
Scale = pow(10, Decimals + 10),
|
|
XSquared = X * X,
|
|
Term = Scale div X, % First term: scale / x
|
|
arctan_iter(XSquared, Term, 0, 0, Decimals).
|
|
|
|
arctan_iter(_XSquared, Term, N, Result, Decimals) when Term == 0; N > Decimals * 3 ->
|
|
Result;
|
|
arctan_iter(XSquared, Term, N, Result, Decimals) ->
|
|
Divisor = 2 * N + 1,
|
|
Contrib = Term div Divisor,
|
|
NewResult = case N rem 2 of
|
|
0 -> Result + Contrib;
|
|
1 -> Result - Contrib
|
|
end,
|
|
NewTerm = Term div XSquared, % Divide by x² each iteration
|
|
arctan_iter(XSquared, NewTerm, N + 1, NewResult, Decimals).
|
|
|
|
% Calculate pi using Machin's formula
|
|
% pi/4 = 4*arctan(1/5) - arctan(1/239)
|
|
calculate_pi(Decimals) ->
|
|
Atan1_5 = arctan(5, Decimals),
|
|
Atan1_239 = arctan(239, Decimals),
|
|
16 * Atan1_5 - 4 * Atan1_239.
|
|
|
|
% Format pi with decimal point
|
|
format_pi(Pi, Decimals) ->
|
|
PiStr = integer_to_list(Pi),
|
|
% Pad with leading zeros if needed
|
|
PiStr2 = case length(PiStr) < Decimals + 10 of
|
|
true -> string:left(PiStr, Decimals + 10, $0);
|
|
false -> PiStr
|
|
end,
|
|
"3." ++ string:substr(PiStr2, 2, Decimals).
|
|
|
|
% Power function for integers
|
|
pow(Base, Exp) when Exp >= 0 ->
|
|
pow_iter(Base, Exp, 1).
|
|
|
|
pow_iter(_Base, 0, Acc) -> Acc;
|
|
pow_iter(Base, Exp, Acc) when Exp rem 2 == 0 ->
|
|
pow_iter(Base * Base, Exp div 2, Acc);
|
|
pow_iter(Base, Exp, Acc) ->
|
|
pow_iter(Base, Exp - 1, Acc * Base). |