gleam_community/maths/piecewise
Piecewise: A module containing functions that have different definitions depending on conditions or intervals of their domain.
- Rounding functions
- Sign and absolute value functions
- Misc. mathematical functions
Types
pub type RoundingMode {
RoundNearest
RoundTiesAway
RoundTiesUp
RoundToZero
RoundDown
RoundUp
}
Constructors
-
RoundNearest
-
RoundTiesAway
-
RoundTiesUp
-
RoundToZero
-
RoundDown
-
RoundUp
Functions
pub fn arg_maximum(
arr: List(a),
compare: fn(a, a) -> Order,
) -> Result(List(Int), String)
Returns the indices of the maximum values in a given list.
Example:
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example () {
// An empty lists returns an error
[]
|> piecewise.arg_maximum(float.compare)
|> should.be_error()
// Valid input returns a result
[4.0, 4.0, 3.0, 2.0, 1.0]
|> piecewise.arg_maximum(float.compare)
|> should.equal(Ok([0, 1]))
}
pub fn arg_minimum(
arr: List(a),
compare: fn(a, a) -> Order,
) -> Result(List(Int), String)
Returns the indices of the minimum values in a given list.
Example:
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example () {
// An empty lists returns an error
[]
|> piecewise.arg_minimum(float.compare)
|> should.be_error()
// Valid input returns a result
[4.0, 4.0, 3.0, 2.0, 1.0]
|> piecewise.arg_minimum(float.compare)
|> should.equal(Ok([4]))
}
pub fn ceiling(
x: Float,
digits: Option(Int),
) -> Result(Float, String)
The ceiling function rounds a given input value $$x \in \mathbb{R}$$ to the nearest integer value (at the specified digit) that is larger than or equal to the input $$x$$.
Note: The ceiling function is used as an alias for the rounding function round
with rounding mode RoundUp
.
Details
For example, $$12.0654$$ is rounded to:
- $$13.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.1$$ for 1 digit after the decimal point (
digits = 1
) - $$12.07$$ for 2 digits after the decimal point (
digits = 2
) - $$12.066$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point. For example, $$12.0654$$ is rounded to:
- $$20.0$$ for 1 digit places before the decimal point (
digit = -1
) - $$100.0$$ for 2 digits before the decimal point (
digits = -2
) - $$1000.0$$ for 3 digits before the decimal point (
digits = -3
)
Example
import gleeunit/should
import gleam/option
import gleam_community/maths/piecewise
pub fn example() {
piecewise.ceiling(12.0654, option.Some(1))
|> should.equal(Ok(12.1))
piecewise.ceiling(12.0654, option.Some(2))
|> should.equal(Ok(12.07))
piecewise.ceiling(12.0654, option.Some(3))
|> should.equal(Ok(12.066))
}
pub fn extrema(
arr: List(a),
compare: fn(a, a) -> Order,
) -> Result(#(a, a), String)
Returns a tuple consisting of the minimum and maximum values of a given list.
Example:
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example () {
// An empty lists returns an error
[]
|> piecewise.extrema(float.compare)
|> should.be_error()
// Valid input returns a result
[4.0, 4.0, 3.0, 2.0, 1.0]
|> piecewise.extrema(float.compare)
|> should.equal(Ok(#(1.0, 4.0)))
}
pub fn float_absolute_difference(a: Float, b: Float) -> Float
The absolute difference:
\[ \forall x, y \in \mathbb{R}, \; |x - y| \in \mathbb{R}_{+}. \]
The function takes two inputs $$x$$ and $$y$$ and returns a positive float value which is the the absolute difference of the inputs.
Example
import gleeunit/should
import gleam_community/maths/piecewise
pub fn example() {
piecewise.float_absolute_difference(-10.0, 10.0)
|> should.equal(20.0)
piecewise.float_absolute_difference(0.0, -2.0)
|> should.equal(2.0)
}
pub fn float_absolute_value(x: Float) -> Float
The absolute value:
\[ \forall x, y \in \mathbb{R}, \; |x| \in \mathbb{R}_{+}. \]
The function takes an input $$x$$ and returns a positive float value.
pub fn float_copy_sign(x: Float, y: Float) -> Float
The function takes two arguments $$x, y \in \mathbb{R}$$ and returns $$x$$ such that it has the same sign as $$y$$.
pub fn float_flip_sign(x: Float) -> Float
The function flips the sign of a given input value $$x \in \mathbb{R}$$.
pub fn float_sign(x: Float) -> Float
The function takes an input $$x \in \mathbb{R}$$ and returns the sign of the input, indicating whether it is positive (+1.0), negative (-1.0), or zero (0.0).
pub fn floor(
x: Float,
digits: Option(Int),
) -> Result(Float, String)
The floor function rounds input $$x \in \mathbb{R}$$ to the nearest integer value (at the specified digit) that is less than or equal to the input $$x$$.
Note: The floor function is used as an alias for the rounding function round
with rounding mode RoundDown
.
Details
For example, $$12.0654$$ is rounded to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.0$$ for 1 digits after the decimal point (
digits = 1
) - $$12.06$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
Example
import gleeunit/should
import gleam/option
import gleam_community/maths/piecewise
pub fn example() {
piecewise.floor(12.0654, option.Some(1))
|> should.equal(Ok(12.0))
piecewise.floor(12.0654, option.Some(2))
|> should.equal(Ok(12.06))
piecewise.floor(12.0654, option.Some(3))
|> should.equal(Ok(12.065))
}
pub fn int_absolute_difference(a: Int, b: Int) -> Int
The absolute difference:
\[ \forall x, y \in \mathbb{Z}, \; |x - y| \in \mathbb{Z}_{+}. \]
The function takes two inputs $$x$$ and $$y$$ and returns a positive integer value which is the the absolute difference of the inputs.
Example:
import gleeunit/should
import gleam_community/maths/piecewise
pub fn example() {
piecewise.absolute_difference(-10, 10)
|> should.equal(20)
piecewise.absolute_difference(0, -2)
|> should.equal(2)
}
pub fn int_absolute_value(x: Int) -> Int
The absolute value:
\[ \forall x, y \in \mathbb{Z}, \; |x| \in \mathbb{Z}_{+}. \]
The function takes an input $$x$$ and returns a positive integer value.
pub fn int_copy_sign(x: Int, y: Int) -> Int
The function takes two arguments $$x, y \in \mathbb{Z}$$ and returns $$x$$ such that it has the same sign as $$y$$.
pub fn int_flip_sign(x: Int) -> Int
The function flips the sign of a given input value $$x \in \mathbb{Z}$$.
pub fn int_sign(x: Int) -> Int
The function takes an input $$x \in \mathbb{Z}$$ and returns the sign of the input, indicating whether it is positive (+1), negative (-1), or zero (0).
pub fn list_maximum(
arr: List(a),
compare: fn(a, a) -> Order,
) -> Result(a, String)
Returns the maximum value of a given list.
Example:
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example () {
// An empty lists returns an error
[]
|> piecewise.list_maximum(float.compare)
|> should.be_error()
// Valid input returns a result
[4.0, 4.0, 3.0, 2.0, 1.0]
|> piecewise.list_maximum(float.compare)
|> should.equal(Ok(4.0))
}
pub fn list_minimum(
arr: List(a),
compare: fn(a, a) -> Order,
) -> Result(a, String)
Returns the minimum value of a given list.
Example:
import gleeunit/should
import gleam/int
import gleam_community/maths/piecewise
pub fn example () {
// An empty lists returns an error
[]
|> piecewise.list_minimum(int.compare)
|> should.be_error()
// Valid input returns a result
[4, 4, 3, 2, 1]
|> piecewise.list_minimum(int.compare)
|> should.equal(Ok(1))
}
pub fn maximum(x: a, y: a, compare: fn(a, a) -> Order) -> a
The maximum function takes two arguments $$x, y$$ along with a function for comparing $$x, y$$. The function returns the largest of the two given values.
Example
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example() {
piecewise.maximum(2.0, 1.5, float.compare)
|> should.equal(1.5)
piecewise.maximum(1.5, 2.0, float.compare)
|> should.equal(1.5)
}
pub fn minimum(x: a, y: a, compare: fn(a, a) -> Order) -> a
The minimum function takes two arguments $$x, y$$ along with a function for comparing $$x, y$$. The function returns the smallest of the two given values.
Example
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example() {
piecewise.minimum(2.0, 1.5, float.compare)
|> should.equal(1.5)
piecewise.minimum(1.5, 2.0, float.compare)
|> should.equal(1.5)
}
pub fn minmax(x: a, y: a, compare: fn(a, a) -> Order) -> #(a, a)
The minmax function takes two arguments $$x, y$$ along with a function for comparing $$x, y$$. The function returns a tuple with the smallest value first and largest second.
Example
import gleeunit/should
import gleam/float
import gleam_community/maths/piecewise
pub fn example() {
piecewise.minmax(2.0, 1.5, float.compare)
|> should.equal(#(1.5, 2.0))
piecewise.minmax(1.5, 2.0, float.compare)
|> should.equal(#(1.5, 2.0))
}
pub fn round(
x: Float,
digits: Option(Int),
mode: Option(RoundingMode),
) -> Result(Float, String)
The function rounds a float to a specific number of digits (after the decimal place or before if negative) using a specified rounding mode.
Valid rounding modes include:
RoundNearest
(default): The input $$x$$ is rounded to the nearest integer value (at the specified digit) with ties (fractional values of 0.5) being rounded to the nearest even integer.RoundTiesAway
: The input $$x$$ is rounded to the nearest integer value (at the specified digit) with ties (fractional values of 0.5) being rounded away from zero (C/C++ rounding behavior).RoundTiesUp
: The input $$x$$ is rounded to the nearest integer value (at the specified digit) with ties (fractional values of 0.5) being rounded towards $$+\infty$$ (Java/JavaScript rounding behaviour).RoundToZero
: The input $$x$$ is rounded to the nearest integer value (at the specified digit) that is less than or equal to the absolute value of the input $$x$$. An alias for this rounding mode istruncate
.RoundDown
: The input $$x$$ is rounded to the nearest integer value (at the specified digit) that is less than or equal to the input $$x$$. An alias for this rounding mode isfloor
.RoundUp
: The input $$x$$ is rounded to the nearest integer value (at the specified digit) that is larger than or equal to the input $$x$$. An alias for this rounding mode isceiling
.
Details
The RoundNearest
rounding mode, rounds $$12.0654$$ to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.1$$ for 1 digit after the decimal point (
digits = 1
) - $$12.07$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
The RoundTiesAway
rounding mode, rounds $$12.0654$$ to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.1$$ for 1 digit after the decimal point (
digits = 1
) - $$12.07$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
The RoundTiesUp
rounding mode, rounds $$12.0654$$ to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.1$$ for 1 digits after the decimal point (
digits = 1
) - $$12.07$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
The RoundToZero
rounding mode, rounds $$12.0654$$ to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.0$$ for 1 digit after the decimal point (
digits = 1
) - $$12.06$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
The RoundDown
rounding mode, rounds $$12.0654$$ to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.0$$ for 1 digits after the decimal point (
digits = 1
) - $$12.06$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
The RoundUp
rounding mode, rounds $$12.0654$$ to:
- $$13.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.1$$ for 1 digit after the decimal point (
digits = 1
) - $$12.07$$ for 2 digits after the decimal point (
digits = 2
) - $$12.066$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$20.0$$ for 1 digit places before the decimal point (
digit = -1
) - $$100.0$$ for 2 digits before the decimal point (
digits = -2
) - $$1000.0$$ for 3 digits before the decimal point (
digits = -3
)
Example
import gleeunit/should
import gleam/option
import gleam_community/maths/piecewise
pub fn example() {
// The default number of digits is 0 if None is provided
piecewise.round(12.0654, option.None, option.Some(piecewise.RoundNearest))
|> should.equal(Ok(12.0))
// The default rounding mode is "RoundNearest" if None is provided
piecewise.round(12.0654, option.None, option.None)
|> should.equal(Ok(12.0))
// Try different rounding modes
piecewise.round(12.0654, option.Some(2), option.Some(piecewise.RoundNearest))
|> should.equal(Ok(12.07))
piecewise.round(12.0654, option.Some(2), option.Some(piecewise.RoundTiesAway))
|> should.equal(Ok(12.07))
piecewise.round(12.0654, option.Some(2), option.Some(piecewise.RoundTiesUp))
|> should.equal(Ok(12.07))
piecewise.round(12.0654, option.Some(2), option.Some(piecewise.RoundToZero))
|> should.equal(Ok(12.06))
piecewise.round(12.0654, option.Some(2), option.Some(piecewise.RoundDown))
|> should.equal(Ok(12.06))
piecewise.round(12.0654, option.Some(2), option.Some(piecewise.RoundUp))
|> should.equal(Ok(12.07))
}
pub fn truncate(
x: Float,
digits: Option(Int),
) -> Result(Float, String)
The truncate function rounds a given input $$x \in \mathbb{R}$$ to the nearest integer value (at the specified digit) that is less than or equal to the absolute value of the input $$x$$.
Note: The truncate function is used as an alias for the rounding function round
with rounding mode RoundToZero
.
Details
For example, $$12.0654$$ is rounded to:
- $$12.0$$ for 0 digits after the decimal point (
digits = 0
) - $$12.0$$ for 1 digits after the decimal point (
digits = 1
) - $$12.06$$ for 2 digits after the decimal point (
digits = 2
) - $$12.065$$ for 3 digits after the decimal point (
digits = 3
)
It is also possible to specify a negative number of digits. In that case, the negative number refers to the digits before the decimal point.
- $$10.0$$ for 1 digit before the decimal point (
digits = -1
) - $$0.0$$ for 2 digits before the decimal point (
digits = -2
) - $$0.0$$ for 3 digits before the decimal point (
digits = -3
)
Example
import gleeunit/should
import gleam/option
import gleam_community/maths/piecewise
pub fn example() {
piecewise.truncate(12.0654, option.Some(1))
|> should.equal(Ok(12.0))
piecewise.truncate(12.0654, option.Some(2))
|> should.equal(Ok(12.0))
piecewise.truncate(12.0654, option.Some(3))
|> should.equal(Ok(12.0))
}