View Source Measurements (Measurements v0.1.2)

Documentation for Measurements.

A measurement is a quantity represented, by a value, a unit and an error.

The value is usually an integer to maintain maximum precision, but can also be a float if required.

examples

Examples

iex> Measurements.time(42, :second)
%Measurements{
  value: 42,
  unit: :second,
  error: 0
}

Link to this section Summary

Types

t()

Measurement Type

Functions

Add error to a Measurement.

Convert the measurement to the new unit, if the new unit is more precise.

The difference of two measurements, with implicit unit conversion.

Length Measurement.

Generic Measurement. Unit indicates the dimension.

The ratio of two measurements, with implicit unit conversion.

Scales a measurement by a number.

The sum of multiple measurements, with implicit unit conversion.

Time Measurement.

Link to this section Types

@type t() :: %Measurements{
  error: non_neg_integer(),
  unit: Measurements.Unit.t(),
  value: integer()
}

Measurement Type

Link to this section Functions

Link to this function

add_error(value, err, unit)

View Source
@spec add_error(t(), integer(), Measurements.Unit.t()) :: t()

Add error to a Measurement.

The error is symmetric and always represented by a positive number. The measurement unit is converted if needed to not loose precision.

examples

Examples

iex> Measurements.time(42, :second) |> Measurements.add_error(-4, :millisecond)
%Measurements{
  value: 42_000,
  unit: :millisecond,
  error: 4
}
@spec best_convert(t(), Measurements.Unit.t()) :: t()

Convert the measurement to the new unit, if the new unit is more precise.

This will pick the most precise between the measurement's unit and the new unit. Then it will convert the measurement to the chosen unit.

If no conversion is possible, the original measurement is returned.

examples

Examples

iex> Measurements.time(42, :second) |> Measurements.add_error(1, :second) |> Measurements.best_convert(:millisecond)
%Measurements{value: 42_000, unit: :millisecond, error: 1_000}

iex> Measurements.time(42, :millisecond) |> Measurements.add_error(1, :millisecond) |> Measurements.best_convert(:second)
%Measurements{value: 42, unit: :millisecond, error: 1}

The difference of two measurements, with implicit unit conversion.

Only measurements with the same unit dimension will work. Error will be propagated (ie compounded).

examples

Examples

iex>  m1 = Measurements.time(42, :second) |> Measurements.add_error(1, :second)
iex>  m2 = Measurements.time(543, :millisecond) |> Measurements.add_error(3, :millisecond)
iex> Measurements.delta(m1, m2)
%Measurements{
  value: 41_457,
  unit: :millisecond,
  error: 1_003
}
Link to this function

length(v, unit, err \\ 0)

View Source
@spec length(integer(), Measurements.Unit.t(), integer()) :: t()

Length Measurement.

examples

Examples

iex> Measurements.length(42, :meter)
%Measurements{
  value: 42,
  unit: :meter
}
@spec new(integer(), Measurements.Unit.t(), integer()) :: t()

Generic Measurement. Unit indicates the dimension.

examples

Examples

iex> Measurements.new(42, :meter)
%Measurements{
  value: 42,
  unit: :meter
}

The ratio of two measurements, with implicit unit conversion.

Only measurements with the same unit dimension will work, currently. Error will be propagated (ie relatively compounded) as an int if possible.

examples

Examples

iex>  m1 = Measurements.time(300, :second) |> Measurements.add_error(1, :second)
iex>  m2 = Measurements.time(60_000, :millisecond) |> Measurements.add_error(3, :millisecond)
iex> Measurements.ratio(m1, m2)
%Measurements{
  value: 5,
  unit: nil,
  error: 0.01691666666666667
}

Scales a measurement by a number.

No unit conversion happens at this stage for simplicity, and to keep the scale of the resulting value obvious. Error will be scaled by the same number, but always remains positive.

examples

Examples

  iex>  m1 = Measurements.time(543, :millisecond) |> Measurements.add_error(3, :millisecond)
  iex> Measurements.scale(m1, 10)
  %Measurements{
    value: 5430,
    unit: :millisecond,
    error: 30
  }

The sum of multiple measurements, with implicit unit conversion.

Only measurements with the same unit dimension will work. Error will be propagated.

examples

Examples

iex>  m1 = Measurements.time(42, :second) |> Measurements.add_error(1, :second)
iex>  m2 = Measurements.time(543, :millisecond) |> Measurements.add_error(3, :millisecond)
iex> Measurements.sum(m1, m2)
%Measurements{
  value: 42_543,
  unit: :millisecond,
  error: 1_003
}
@spec time(integer(), Measurements.Unit.t(), integer()) :: t()

Time Measurement.

examples

Examples

iex> Measurements.time(42, :second)
%Measurements{
  value: 42,
  unit: :second
}