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
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
@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
}
@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
}