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