Packages
gleam_stdlib
0.27.0
1.0.3
1.0.2
1.0.1
1.0.0
0.71.0
0.70.0
0.69.0
0.68.1
0.68.0
0.67.1
0.67.0
0.65.0
0.64.0
0.63.2
0.63.1
0.63.0
0.62.1
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.1
0.35.0
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.0
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc1
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.4.0-rc1
0.3.1
0.3.0
0.2.0
retired
A standard library for the Gleam programming language
Current section
Files
Jump to
Current section
Files
src/gleam@float.erl
-module(gleam@float).
-compile([no_auto_import, nowarn_unused_vars]).
-export([compare/2, min/2, max/2, clamp/3, absolute_value/1, loosely_compare/3, loosely_equals/3, negate/1, divide/2, add/2, multiply/2, subtract/2, parse/1, to_string/1, ceiling/1, floor/1, round/1, truncate/1, power/2, square_root/1, random/2, sum/1, product/1]).
-spec compare(float(), float()) -> gleam@order:order().
compare(A, B) ->
case A =:= B of
true ->
eq;
false ->
case A < B of
true ->
lt;
false ->
gt
end
end.
-spec min(float(), float()) -> float().
min(A, B) ->
case A < B of
true ->
A;
false ->
B
end.
-spec max(float(), float()) -> float().
max(A, B) ->
case A > B of
true ->
A;
false ->
B
end.
-spec clamp(float(), float(), float()) -> float().
clamp(X, Min_bound, Max_bound) ->
_pipe = X,
_pipe@1 = min(_pipe, Max_bound),
max(_pipe@1, Min_bound).
-spec absolute_value(float()) -> float().
absolute_value(X) ->
case X >= 0.0 of
true ->
X;
_ ->
0.0 - X
end.
-spec loosely_compare(float(), float(), float()) -> gleam@order:order().
loosely_compare(A, B, Tolerance) ->
Difference = absolute_value(A - B),
case Difference =< Tolerance of
true ->
eq;
false ->
compare(A, B)
end.
-spec loosely_equals(float(), float(), float()) -> boolean().
loosely_equals(A, B, Tolerance) ->
Difference = absolute_value(A - B),
Difference =< Tolerance.
-spec negate(float()) -> float().
negate(X) ->
-1.0 * X.
-spec divide(float(), float()) -> {ok, float()} | {error, nil}.
divide(A, B) ->
case B of
0.0 ->
{error, nil};
B@1 ->
{ok, case B@1 of
0.0 -> 0.0;
Gleam@denominator -> A / Gleam@denominator
end}
end.
-spec add(float(), float()) -> float().
add(A, B) ->
A + B.
-spec multiply(float(), float()) -> float().
multiply(A, B) ->
A * B.
-spec subtract(float(), float()) -> float().
subtract(A, B) ->
A - B.
-spec parse(binary()) -> {ok, float()} | {error, nil}.
parse(String) ->
gleam_stdlib:parse_float(String).
-spec to_string(float()) -> binary().
to_string(X) ->
gleam_stdlib:float_to_string(X).
-spec ceiling(float()) -> float().
ceiling(X) ->
math:ceil(X).
-spec floor(float()) -> float().
floor(X) ->
math:floor(X).
-spec round(float()) -> integer().
round(X) ->
erlang:round(X).
-spec truncate(float()) -> integer().
truncate(X) ->
erlang:trunc(X).
-spec power(float(), float()) -> {ok, float()} | {error, nil}.
power(Base, Exponent) ->
Fractional = (ceiling(Exponent) - Exponent) > 0.0,
case ((Base
< 0.0)
andalso Fractional)
orelse ((Base
=:= 0.0)
andalso (Exponent
< 0.0)) of
true ->
{error, nil};
false ->
{ok, math:pow(Base, Exponent)}
end.
-spec square_root(float()) -> {ok, float()} | {error, nil}.
square_root(X) ->
power(X, 0.5).
-spec random(float(), float()) -> float().
random(Boundary_a, Boundary_b) ->
{Min, Max} = case {Boundary_a, Boundary_b} of
{A, B} when A =< B ->
{A, B};
{A@1, B@1} when A@1 > B@1 ->
{B@1, A@1}
end,
case {Min, Max} of
{Min@1, _} when Min@1 =:= Max ->
Min@1;
{Min@2, Max@1} ->
(rand:uniform() * (Max@1 - Min@2)) + Min@2
end.
-spec do_sum(list(float()), float()) -> float().
do_sum(Numbers, Initial) ->
case Numbers of
[] ->
Initial;
[X | Rest] ->
do_sum(Rest, X + Initial)
end.
-spec sum(list(float())) -> float().
sum(Numbers) ->
_pipe = Numbers,
do_sum(_pipe, 0.0).
-spec do_product(list(float()), float()) -> float().
do_product(Numbers, Initial) ->
case Numbers of
[] ->
Initial;
[X | Rest] ->
do_product(Rest, X * Initial)
end.
-spec product(list(float())) -> float().
product(Numbers) ->
case Numbers of
[] ->
1.0;
_ ->
do_product(Numbers, 1.0)
end.