Files
print_hej/erlang/src/print_hej.erl
T
Ein Anderssono 54d2fecee0 Initial commit: Pi calculation benchmark with 34 languages
- 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
2026-04-23 00:26:18 +02:00

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).