Packages

Numeric algorithms in Elixir. Version 0.1.0 includes a Newton solver for nonlinear equations in one dimension.

Current section

Files

Jump to
fluxion lib math.ex
Raw

lib/math.ex

defmodule Fluxion.Math do
@moduledoc """
This module defines some floating-point operations used in this package and
its supporting tests.
"""
@epsilon 1.0e-15
@doc """
Compare two floating point numbers for equality, allowing for small
deviations.
## Examples
iex> Fluxion.Math.is_equal(0, 0)
:true
iex> Fluxion.Math.is_equal(1, 2)
:false
iex> Fluxion.Math.is_equal(1, 2, 1)
:true
iex> Fluxion.Math.is_equal(0.3, 0.1 + 0.2)
:true
iex> Fluxion.Math.is_equal(10, 10 + 1.0e-6)
:false
"""
@spec is_equal(number, number, number) :: true | false
def is_equal(a, b, epsilon \\ @epsilon) do
diff = abs(a - b)
cond do
a === 0 || b === 0 ->
diff < epsilon
true ->
diff / max(max(a, b), epsilon) < epsilon
end
end
end