Packages
vtc
0.3.2
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.15
0.13.14
0.13.13
0.13.12
0.13.11
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.10
0.10.9
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
A SMPTE timecode library for Elixir
Current section
Files
Jump to
Current section
Files
lib/utils_rational.ex
defmodule Vtc.Utils.Rational do
@moduledoc """
Helper functions and types for working with the Ratio module.
"""
@typedoc """
The Ratio module will often convert itself to an integer value if the result would be
a whole number, but otherwise return a %Ratio{} struct.
This type can be used when working with such a value.
"""
@type t() :: Ratio.t() | integer()
@doc """
Rounds a Ratio to the nearest integer.
"""
@spec round(t()) :: integer()
def round(x) when is_integer(x), do: x
def round(%Ratio{} = x) do
floored = Ratio.floor(x)
remainder = Ratio.sub(x, floored)
case Ratio.compare(remainder, Ratio.new(1, 2)) do
:gt -> Ratio.add(floored, 1)
_ -> floored
end
end
@doc """
Does the divmod operation on a rational vale, returns a
{whole_dividend, rational_rainder} tuple.
"""
@spec divmod(t(), t()) :: {integer(), t()}
def divmod(a, b) do
dividend = a |> Ratio.div(b) |> Ratio.floor()
multiplied = Ratio.mult(dividend, b)
remainder = Ratio.sub(a, multiplied)
{dividend, remainder}
end
end