Current section

Files

Jump to
bigi src bigi_ffi.erl
Raw

src/bigi_ffi.erl

-module(bigi_ffi).
-export([
from/1,
to/1,
zero/0,
compare/2,
add/2,
subtract/2,
multiply/2,
divide/2,
divide_no_zero/2,
remainder/2,
remainder_no_zero/2,
modulo/2,
modulo_no_zero/2,
power/2
]).
from(Int) -> Int.
to(BigInt) -> {ok, BigInt}.
zero() -> 0.
compare(A, B) when A < B -> gt;
compare(A, B) when A > B -> lt;
compare(_, _) -> eq.
add(A, B) -> A + B.
subtract(A, B) -> A - B.
multiply(A, B) -> A * B.
divide(_, 0) -> 0;
divide(A, B) -> A div B.
divide_no_zero(_, 0) -> {error, nil};
divide_no_zero(A, B) -> {ok, divide(A, B)}.
remainder(_, 0) -> 0;
remainder(A, B) -> A rem B.
remainder_no_zero(_, 0) -> {error, nil};
remainder_no_zero(A, B) -> {ok, remainder(A, B)}.
modulo(_, 0) -> 0;
modulo(A, B) -> ((A rem B) + B) rem B.
modulo_no_zero(_, 0) -> {error, nil};
modulo_no_zero(A, B) -> {ok, modulo(A, B)}.
power(_, 0) ->
1;
power(A, 1) ->
A;
power(A, N) ->
B = power(A, N div 2),
B * B *
(case N rem 2 of
0 -> 1;
1 -> A
end).