Struct inari::Interval

source Β·
#[repr(C)]
pub struct Interval { /* private fields */ }
Expand description

An interval with f64 bounds.

It is sometimes referred to as a bare interval in contrast to a decorated interval (DecInterval).

Implementations§

source§

impl Interval

source

pub fn abs(self) -> Self

Returns the absolute value of self.

The domain and the range of the point function are:

DomainRange
$\R$$[0, ∞)$
source

pub fn max(self, rhs: Self) -> Self

Returns the maximum of self and rhs.

The domain and the range of the point function are:

DomainRange
$\R^2$$\R$
source

pub fn min(self, rhs: Self) -> Self

Returns the minimum of self and rhs.

The domain and the range of the point function are:

DomainRange
$\R^2$$\R$
source§

impl Interval

source

pub fn mul_rev_to_pair(self, numerator: Self) -> [Self; 2]

Returns the reverse multiplication $\numerator \setdivβ€² \self$ (beware the order of the arguments) as an array of two intervals. The operation is also known as two-output division in IEEE Std 1788-2015.

For intervals $𝒙$ and $π’š$, the reverse multiplication is defined as:

$$ 𝒙 \setdivβ€² π’š = \set{z ∈ \R ∣ βˆƒy ∈ π’š : zy ∈ 𝒙}. $$

For comparison, the standard division is defined as:

$$ \begin{align*} 𝒙 \setdiv π’š &= \set{x / y ∣ (x, y) ∈ 𝒙 Γ— π’š βˆ– \set 0} \\ &= \set{z ∈ \R ∣ βˆƒy ∈ π’š βˆ– \set 0 : zy ∈ 𝒙}. \end{align*} $$

The interval division $𝒙 / π’š$ is an enclosure of $𝒙 \setdiv π’š$. A notable difference between two definitions is that when $𝒙 = π’š = \set 0$, $𝒙 \setdiv π’š = βˆ…$, while $𝒙 \setdivβ€² π’š = \R$.

The function returns:

  • [Interval::EMPTY; 2] if $\numerator \setdivβ€² \self$ is empty;
  • [z, Interval::EMPTY] if $\numerator \setdivβ€² \self$ has one component $𝒛$, where z is the tightest enclosure of $𝒛$;
  • [z1, z2] if $\numerator \setdivβ€² \self$ has two components $𝒛₁$ and $𝒛₂$ ordered so that $\sup 𝒛₁ ≀ \inf 𝒛₂$, where z1 and z2 are the tightest enclosures of $𝒛₁$ and $𝒛₂$, respectively.

When $\self β‰  βˆ… ∧ \numerator β‰  βˆ…$, the number of components $\numerator \setdivβ€² \self$ has are summarized as:

$0 ∈ \numerator$$0 βˆ‰ \numerator$
$0 ∈ \self$10, 1, or 2
$0 βˆ‰ \self$11
Examples
use inari::{Interval as I, const_interval as c};
let zero = c!(0.0, 0.0);
assert_eq!(zero.mul_rev_to_pair(c!(1.0, 2.0)), [I::EMPTY; 2]);
assert_eq!(zero.mul_rev_to_pair(c!(0.0, 2.0)), [I::ENTIRE, I::EMPTY]);
assert_eq!(zero.mul_rev_to_pair(zero), [I::ENTIRE, I::EMPTY]);
let x = c!(1.0, 2.0);
assert_eq!(I::ENTIRE.mul_rev_to_pair(x), [c!(f64::NEG_INFINITY, 0.0), c!(0.0, f64::INFINITY)]);
assert_eq!(c!(1.0, 1.0).mul_rev_to_pair(x), [x, I::EMPTY]);
assert_eq!(c!(1.0, f64::INFINITY).mul_rev_to_pair(c!(1.0, 1.0)),
           [c!(0.0, 1.0), I::EMPTY]);
assert_eq!(c!(-1.0, 1.0).mul_rev_to_pair(c!(1.0, 2.0)),
           [c!(f64::NEG_INFINITY, -1.0), c!(1.0, f64::INFINITY)]);
assert_eq!(c!(-1.0, 1.0).mul_rev_to_pair(zero), [I::ENTIRE, I::EMPTY]);
source

pub fn cancel_minus(self, rhs: Self) -> Self

Returns the tightest interval z such that rhs $+$ z $βŠ‡$ self, if both self and rhs are bounded and the width of self is greater than or equal to that of rhs. Otherwise, returns Interval::ENTIRE.

Even when x.cancel_minus(y) is not Interval::ENTIRE, its value is generally different from x - y, as the latter gives the tightest enclosure of x $-$ y, while the former does not always enclose x $-$ y. In such case, x.cancel_minus(y) $βŠ†$ x - y holds, but generally not the equality.

Examples

Getting an enclosure of a partial sum omitting a single term from their total:

use inari::*;
let x = interval!("[0.1, 0.2]").unwrap();
let y = interval!("[0.3, 0.4]").unwrap();
let z = interval!("[0.5, 0.6]").unwrap();
let sum = x + y + z;
assert!((y + z).subset(sum.cancel_minus(x)));
assert!((x + z).subset(sum.cancel_minus(y)));
assert!((x + y).subset(sum.cancel_minus(z)));

sum.cancel_minus(x) is a subset of sum - x:

assert!(sum.cancel_minus(x).subset(sum - x));

But the inverse does not hold in general:

β“˜
assert!((sum - x).subset(sum.cancel_minus(x)));

sum.cancel_minus(x), etc. returns Interval::ENTIRE when sum is unbounded:

use inari::*;
let x = const_interval!(1.0, 2.0);
let y = const_interval!(3.0, f64::MAX);
let sum = x + y;
assert_eq!(sum.cancel_minus(x), Interval::ENTIRE);
assert_eq!(sum.cancel_minus(y), Interval::ENTIRE);

sum.cancel_minus(x) returns Interval::ENTIRE when the width of β€œsum” is less than that of x:

use inari::*;
let x = const_interval!(1.0, 2.0);
let sum = const_interval!(4.0, 4.5);
assert_eq!(sum.cancel_minus(x), Interval::ENTIRE);
source

pub fn cancel_plus(self, rhs: Self) -> Self

x.cancel_plus(y) is equivalent to x.cancel_minus(-y).

See Interval::cancel_minus for more information.

source

pub fn mul_add(self, rhs: Self, addend: Self) -> Self

Returns $(\self Γ— \rhs) + \addend$.

The domain and the range of the point function are:

DomainRange
$\R^3$$\R$
source

pub fn recip(self) -> Self

Returns the multiplicative inverse of self.

The domain and the range of the point function are:

DomainRange
$\R βˆ– \set 0$$\R βˆ– \set 0$
source

pub fn sqr(self) -> Self

Returns the square of self.

The domain and the range of the point function are:

DomainRange
$\R$$[0, ∞)$
source

pub fn sqrt(self) -> Self

Returns the principal square root of self.

The domain and the range of the point function are:

DomainRange
$[0, ∞)$$[0, ∞)$
source§

impl Interval

source

pub fn contains(self, rhs: f64) -> bool

Returns true if rhs is a member of self: $\rhs ∈ \self$.

The result is false whenever rhs is infinite or NaN.

Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).contains(1.0));
assert!(!Interval::EMPTY.contains(1.0));
assert!(Interval::ENTIRE.contains(1.0));

$±∞$ and NaN are not real numbers, thus do not belong to any interval:

use inari::*;
assert!(!Interval::ENTIRE.contains(f64::INFINITY));
assert!(!Interval::ENTIRE.contains(f64::NEG_INFINITY));
assert!(!Interval::ENTIRE.contains(f64::NAN));
source

pub fn disjoint(self, rhs: Self) -> bool

Returns true if self and rhs are disjoint:

$$ \self ∩ \rhs = βˆ…, $$

or equivalently,

$$ βˆ€x ∈ \self, βˆ€y ∈ \rhs : x β‰  y, $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truetrue
$\self = [a, b]$true$b < c ∨ d < a$
Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).disjoint(const_interval!(3.0, 4.0)));
assert!(!const_interval!(1.0, 3.0).disjoint(const_interval!(3.0, 4.0)));
assert!(!const_interval!(1.0, 5.0).disjoint(const_interval!(3.0, 4.0)));
assert!(Interval::EMPTY.disjoint(Interval::EMPTY));
assert!(Interval::EMPTY.disjoint(Interval::ENTIRE));
source

pub fn interior(self, rhs: Self) -> bool

Returns true if self is interior to rhs:

$$ (βˆ€x ∈ \self, βˆƒy ∈ \rhs : x < y) ∧ (βˆ€x ∈ \self, βˆƒy ∈ \rhs : y < x), $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truetrue
$\self = [a, b]$false$c <β€² a ∧ b <β€² d$

where $<β€²$ is defined as:

$$ x <β€² y :⟺ x < y ∨ x = y = -∞ ∨ x = y = +∞. $$

Examples
use inari::*;
assert!(const_interval!(1.1, 1.9).interior(const_interval!(1.0, 2.0)));
assert!(!const_interval!(1.1, 2.0).interior(const_interval!(1.0, 2.0)));
assert!(Interval::EMPTY.interior(Interval::EMPTY));
assert!(Interval::ENTIRE.interior(Interval::ENTIRE));
source

pub fn is_common_interval(self) -> bool

Returns true if self is nonempty and bounded.

Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).is_common_interval());
assert!(!const_interval!(1.0, f64::INFINITY).is_common_interval());
assert!(!Interval::EMPTY.is_common_interval());
assert!(!Interval::ENTIRE.is_common_interval());
source

pub fn is_empty(self) -> bool

Returns true if self is empty: $\self = βˆ…$.

Examples
use inari::*;
assert!(!const_interval!(1.0, 1.0).is_empty());
assert!(Interval::EMPTY.is_empty());
assert!(!Interval::ENTIRE.is_empty());
source

pub fn is_entire(self) -> bool

Returns true if $\self = [-∞, +∞]$.

Examples
use inari::*;
assert!(!const_interval!(1.0, f64::INFINITY).is_entire());
assert!(!Interval::EMPTY.is_entire());
assert!(Interval::ENTIRE.is_entire());
source

pub fn is_singleton(self) -> bool

Returns true if self consists of a single real number:

$$ βˆƒx ∈ ℝ : \self = [x, x]. $$

The result is false whenever self is empty or unbounded.

Examples
use inari::*;
assert!(const_interval!(1.0, 1.0).is_singleton());
assert!(!const_interval!(1.0, 2.0).is_singleton());
assert!(!Interval::EMPTY.is_singleton());
assert!(!Interval::ENTIRE.is_singleton());

0.1 is not representable as a f64 number:

use inari::*;
// The singleton interval that consists of the closest [`f64`] number to 0.1.
assert!(const_interval!(0.1, 0.1).is_singleton());
// The tightest interval that encloses 0.1.
#[cfg(feature = "gmp")]
assert!(!interval!("[0.1, 0.1]").unwrap().is_singleton());
source

pub fn less(self, rhs: Self) -> bool

Returns true if self is weakly less than rhs:

$$ (βˆ€x ∈ \self, βˆƒy ∈ \rhs : x ≀ y) ∧ (βˆ€y ∈ \rhs, βˆƒx ∈ \self : x ≀ y), $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truefalse
$\self = [a, b]$false$a ≀ c ∧ b ≀ d$
Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).less(const_interval!(3.0, 4.0)));
assert!(const_interval!(1.0, 3.0).less(const_interval!(2.0, 4.0)));
assert!(const_interval!(1.0, 4.0).less(const_interval!(1.0, 4.0)));
assert!(Interval::EMPTY.less(Interval::EMPTY));
assert!(!Interval::EMPTY.less(Interval::ENTIRE));
assert!(!Interval::ENTIRE.less(Interval::EMPTY));
assert!(Interval::ENTIRE.less(Interval::ENTIRE));
source

pub fn precedes(self, rhs: Self) -> bool

Returns true if self is to the left of rhs but may touch it:

$$ βˆ€x ∈ \self, βˆ€y ∈ \rhs : x ≀ y, $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truetrue
$\self = [a, b]$true$b ≀ c$
Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).precedes(const_interval!(3.0, 4.0)));
assert!(const_interval!(1.0, 3.0).precedes(const_interval!(3.0, 4.0)));
assert!(!const_interval!(1.0, 3.0).precedes(const_interval!(2.0, 4.0)));
assert!(Interval::EMPTY.precedes(Interval::EMPTY));
assert!(Interval::EMPTY.precedes(Interval::ENTIRE));
assert!(Interval::ENTIRE.precedes(Interval::EMPTY));
assert!(!Interval::ENTIRE.precedes(Interval::ENTIRE));
source

pub fn strict_less(self, rhs: Self) -> bool

Returns true if self is strictly less than rhs:

$$ (βˆ€x ∈ \self, βˆƒy ∈ \rhs : x < y) ∧ (βˆ€y ∈ \self, βˆƒx ∈ \rhs : x < y), $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truefalse
$\self = [a, b]$false$a <β€² c ∧ b <β€² d$

where $<β€²$ is defined as:

$$ x <β€² y :⟺ x < y ∨ x = y = -∞ ∨ x = y = +∞. $$

Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).strict_less(const_interval!(3.0, 4.0)));
assert!(const_interval!(1.0, 3.0).strict_less(const_interval!(2.0, 4.0)));
assert!(!const_interval!(1.0, 4.0).strict_less(const_interval!(2.0, 4.0)));
assert!(const_interval!(1.0, f64::INFINITY).strict_less(const_interval!(2.0, f64::INFINITY)));
assert!(Interval::EMPTY.strict_less(Interval::EMPTY));
assert!(!Interval::EMPTY.strict_less(Interval::ENTIRE));
assert!(!Interval::ENTIRE.strict_less(Interval::EMPTY));
assert!(Interval::ENTIRE.strict_less(Interval::ENTIRE));
source

pub fn strict_precedes(self, rhs: Self) -> bool

Returns true if self is strictly to the left of rhs:

$$ βˆ€x ∈ \self, βˆ€y ∈ \rhs : x < y, $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truetrue
$\self = [a, b]$true$b < c$
source

pub fn subset(self, rhs: Self) -> bool

Returns true if self is a subset of rhs:

$$ \self βŠ† \rhs, $$

or equivalently,

$$ βˆ€x ∈ \self, βˆƒy ∈ \rhs : x = y, $$

or equivalently,

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$truetrue
$\self = [a, b]$false$c ≀ a ∧ b ≀ d$
Examples
use inari::*;
assert!(const_interval!(1.0, 2.0).subset(const_interval!(1.0, 2.0)));
assert!(Interval::EMPTY.subset(Interval::EMPTY));
assert!(Interval::EMPTY.subset(Interval::ENTIRE));
assert!(Interval::ENTIRE.subset(Interval::ENTIRE));
source§

impl Interval

source

pub fn to_be_bytes(self) -> [u8; 16]

Returns the interchange representation of self in the big-endian byte order.

source

pub fn to_le_bytes(self) -> [u8; 16]

Returns the interchange representation of self in the little-endian byte order.

source

pub fn to_ne_bytes(self) -> [u8; 16]

Returns the interchange representation of self in the native byte order of the target platform.

source

pub fn try_from_be_bytes(bytes: [u8; 16]) -> Option<Self>

Creates an Interval from its interchange representation in the big-endian byte order.

source

pub fn try_from_le_bytes(bytes: [u8; 16]) -> Option<Self>

Creates an Interval from its interchange representation in the little-endian byte order.

source

pub fn try_from_ne_bytes(bytes: [u8; 16]) -> Option<Self>

Creates an Interval from its interchange representation in the native byte order of the target platform.

source§

impl Interval

source

pub const EMPTY: Self = _

$βˆ…$, the empty set.

source

pub const ENTIRE: Self = _

$[-∞, +∞]$.

source

pub const E: Self = _

The tightest interval enclosing $\e$, the base of natural logarithms.

source

pub const FRAC_1_PI: Self = _

The tightest interval enclosing $1 / Ο€$.

source

pub const FRAC_1_SQRT_2: Self = _

The tightest interval enclosing $1 / \sqrt{2}$.

source

pub const FRAC_2_PI: Self = _

The tightest interval enclosing $2 / Ο€$.

source

pub const FRAC_2_SQRT_PI: Self = _

The tightest interval enclosing $2 / \sqrt{Ο€}$.

source

pub const FRAC_PI_2: Self = _

The tightest interval enclosing $Ο€ / 2$.

source

pub const FRAC_PI_3: Self = _

The tightest interval enclosing $Ο€ / 3$.

source

pub const FRAC_PI_4: Self = _

The tightest interval enclosing $Ο€ / 4$.

source

pub const FRAC_PI_6: Self = _

The tightest interval enclosing $Ο€ / 6$.

source

pub const FRAC_PI_8: Self = _

The tightest interval enclosing $Ο€ / 8$.

source

pub const LN_10: Self = _

The tightest interval enclosing $\ln 10$.

source

pub const LN_2: Self = _

The tightest interval enclosing $\ln 2$.

source

pub const LOG10_2: Self = _

The tightest interval enclosing $\log_{10} 2$.

source

pub const LOG10_E: Self = _

The tightest interval enclosing $\log_{10} \e$.

source

pub const LOG2_10: Self = _

The tightest interval enclosing $\log_2 10$.

source

pub const LOG2_E: Self = _

The tightest interval enclosing $\log_2 \e$.

source

pub const PI: Self = _

The tightest interval enclosing $Ο€$.

source

pub const SQRT_2: Self = _

The tightest interval enclosing $\sqrt{2}$.

source

pub const TAU: Self = _

The tightest interval enclosing $2 Ο€$.

source§

impl Interval

source

pub fn acos(self) -> Self

Returns the inverse cosine of self.

The domain and the range of the point function are:

DomainRange
$[-1, 1]$$[0, Ο€]$
source

pub fn acosh(self) -> Self

Returns the inverse hyperbolic cosine of self.

The domain and the range of the point function are:

DomainRange
$[1, ∞)$$[0, ∞)$
source

pub fn asin(self) -> Self

Returns the inverse sine of self.

The domain and the range of the point function are:

DomainRange
$[-1, 1]$$[-Ο€/2, Ο€/2]$
source

pub fn asinh(self) -> Self

Returns the inverse hyperbolic sine of self.

The domain and the range of the point function are:

DomainRange
$\R$$\R$
source

pub fn atan(self) -> Self

Returns the inverse tangent of self.

The domain and the range of the point function are:

DomainRange
$\R$$(-Ο€/2, Ο€/2)$
source

pub fn atan2(self, rhs: Self) -> Self

Returns the angle of the point $(\rhs, \self)$ measured counterclockwise from the positive $x$-axis in the Euclidean plane.

The domain and the range of the point function are:

DomainRange
$\R^2 βˆ– \set{(0, 0)}$$(-Ο€, Ο€]$
source

pub fn atanh(self) -> Self

Returns the inverse hyperbolic tangent of self.

The domain and the range of the point function are:

DomainRange
$(-1, 1)$$\R$
source

pub fn cos(self) -> Self

Returns the cosine of self.

The domain and the range of the point function are:

DomainRange
$\R$$[-1, 1]$
source

pub fn cosh(self) -> Self

Returns the hyperbolic cosine of self.

The domain and the range of the point function are:

DomainRange
$\R$$[1, ∞)$
source

pub fn exp(self) -> Self

Returns self raised to the power of $\e$.

The domain and the range of the point function are:

DomainRange
$\R$$(0, ∞)$
source

pub fn exp10(self) -> Self

Returns self raised to the power of 10.

The domain and the range of the point function are:

DomainRange
$\R$$(0, ∞)$
source

pub fn exp2(self) -> Self

Returns self raised to the power of 2.

The domain and the range of the point function are:

DomainRange
$\R$$(0, ∞)$
source

pub fn ln(self) -> Self

Returns the natural logarithm of self.

The domain and the range of the point function are:

DomainRange
$(0, ∞)$$\R$
source

pub fn log10(self) -> Self

Returns the base-10 logarithm of self.

The domain and the range of the point function are:

DomainRange
$(0, ∞)$$\R$
source

pub fn log2(self) -> Self

Returns the base-2 logarithm of self.

The domain and the range of the point function are:

DomainRange
$(0, ∞)$$\R$
source

pub fn pow(self, rhs: Self) -> Self

Returns self raised to the power of rhs.

The point function is defined as follows:

$$ x^y = \begin{cases} 0 & \for x = 0 ∧ y > 0, \\ e^{y \ln x} & \for x > 0. \end{cases} $$

The domain and the range of the point function are:

DomainRange
$((0, ∞) Γ— \R) βˆͺ (\set 0 Γ— (0, ∞))$$[0, ∞)$
source

pub fn powi(self, rhs: i32) -> Self

Returns self raised to the power of rhs.

The point functions are indexed by $n$, and are defined as follows:

$$ x^n = \begin{cases} \overbrace{x Γ— β‹― Γ— x}^{n \text{ copies}} & \for n > 0, \\ 1 & \for n = 0, \\ 1 / x^{-n} & \for n < 0. \end{cases} $$

The domains and the ranges of the point functions are:

DomainRange
$n > 0$, odd$\R$$\R$
$n > 0$, even$\R$$[0, ∞)$
$n = 0$$\R$$\set 1$
$n < 0$, odd$\R βˆ– \set 0$$\R βˆ– \set 0$
$n < 0$, even$\R βˆ– \set 0$$(0, ∞)$
source

pub fn sin(self) -> Self

Returns the sine of self.

The domain and the range of the point function are:

DomainRange
$\R$$[-1, 1]$
source

pub fn sinh(self) -> Self

Returns the hyperbolic sine of self.

The domain and the range of the point function are:

DomainRange
$\R$$\R$
source

pub fn tan(self) -> Self

Returns the tangent of self.

The domain and the range of the point function are:

DomainRange
$\R βˆ– \set{(n + 1/2) Ο€ ∣ n ∈ \Z}$$\R$
source

pub fn tanh(self) -> Self

Returns the hyperbolic tangent of self.

The domain and the range of the point function are:

DomainRange
$\R$$(-1, 1)$
source§

impl Interval

source

pub fn ceil(self) -> Self

Rounds self to the closest integer toward $+∞$.

The domain and the range of the point function are:

DomainRange
$\R$$\Z$
Examples
use inari::*;
assert_eq!(const_interval!(0.2, 1.2).ceil(), const_interval!(1.0, 2.0));
assert_eq!(const_interval!(0.8, 1.8).ceil(), const_interval!(1.0, 2.0));
assert_eq!(const_interval!(-1.2, -0.2).ceil(), const_interval!(-1.0, 0.0));
assert_eq!(const_interval!(-1.8, -0.8).ceil(), const_interval!(-1.0, 0.0));
assert_eq!(Interval::EMPTY.ceil(), Interval::EMPTY);
assert_eq!(Interval::ENTIRE.ceil(), Interval::ENTIRE);

See also: Interval::floor, Interval::trunc.

source

pub fn floor(self) -> Self

Rounds self to the closest integer toward $-∞$.

The domain and the range of the point function are:

DomainRange
$\R$$\Z$
Examples
use inari::*;
assert_eq!(const_interval!(0.2, 1.2).floor(), const_interval!(0.0, 1.0));
assert_eq!(const_interval!(0.8, 1.8).floor(), const_interval!(0.0, 1.0));
assert_eq!(const_interval!(-1.2, -0.2).floor(), const_interval!(-2.0, -1.0));
assert_eq!(const_interval!(-1.8, -0.8).floor(), const_interval!(-2.0, -1.0));
assert_eq!(Interval::EMPTY.floor(), Interval::EMPTY);
assert_eq!(Interval::ENTIRE.floor(), Interval::ENTIRE);

See also: Interval::ceil, Interval::trunc.

source

pub fn round(self) -> Self

Rounds self to the closest integer, away from zero in case of ties.

The domain and the range of the point function are:

DomainRange
$\R$$\Z$
Examples
use inari::*;
assert_eq!(const_interval!(0.2, 1.2).round(), const_interval!(0.0, 1.0));
assert_eq!(const_interval!(0.5, 1.5).round(), const_interval!(1.0, 2.0));
assert_eq!(const_interval!(0.8, 1.8).round(), const_interval!(1.0, 2.0));
assert_eq!(const_interval!(-1.2, -0.2).round(), const_interval!(-1.0, 0.0));
assert_eq!(const_interval!(-1.5, -0.5).round(), const_interval!(-2.0, -1.0));
assert_eq!(const_interval!(-1.8, -0.8).round(), const_interval!(-2.0, -1.0));
assert_eq!(Interval::EMPTY.round(), Interval::EMPTY);
assert_eq!(Interval::ENTIRE.round(), Interval::ENTIRE);

See also: Interval::round_ties_to_even.

source

pub fn round_ties_to_even(self) -> Self

Rounds self to the closest integer, the even number in case of ties.

The domain and the range of the point function are:

DomainRange
$\R$$\Z$
Examples
use inari::*;
assert_eq!(const_interval!(0.2, 1.2).round_ties_to_even(), const_interval!(0.0, 1.0));
assert_eq!(const_interval!(0.5, 1.5).round_ties_to_even(), const_interval!(0.0, 2.0));
assert_eq!(const_interval!(0.8, 1.8).round_ties_to_even(), const_interval!(1.0, 2.0));
assert_eq!(const_interval!(-1.2, -0.2).round_ties_to_even(), const_interval!(-1.0, 0.0));
assert_eq!(const_interval!(-1.5, -0.5).round_ties_to_even(), const_interval!(-2.0, 0.0));
assert_eq!(const_interval!(-1.8, -0.8).round_ties_to_even(), const_interval!(-2.0, -1.0));
assert_eq!(Interval::EMPTY.round_ties_to_even(), Interval::EMPTY);
assert_eq!(Interval::ENTIRE.round_ties_to_even(), Interval::ENTIRE);

See also: Interval::round.

source

pub fn sign(self) -> Self

Returns the sign of self.

The domain and the range of the point function are:

DomainRange
$\R$$\set{-1, 0, 1}$

Note the difference in definition between f64::signum and this function; +0.0_f64.signum() and -0.0_f64.signum() return +1.0 and -1.0, respectively, while the sign of zero is just zero.

Examples
use inari::*;
assert_eq!(const_interval!(-10.0, -0.1).sign(), const_interval!(-1.0, -1.0));
assert_eq!(const_interval!(0.0, 0.0).sign(), const_interval!(0.0, 0.0));
assert_eq!(const_interval!(0.1, 10.0).sign(), const_interval!(1.0, 1.0));
assert_eq!(Interval::EMPTY.sign(), Interval::EMPTY);
assert_eq!(Interval::ENTIRE.sign(), const_interval!(-1.0, 1.0));
source

pub fn trunc(self) -> Self

Rounds self to the closest integer toward zero.

The domain and the range of the point function are:

DomainRange
$\R$$\Z$
Examples
use inari::*;
assert_eq!(const_interval!(0.2, 1.2).trunc(), const_interval!(0.0, 1.0));
assert_eq!(const_interval!(0.8, 1.8).trunc(), const_interval!(0.0, 1.0));
assert_eq!(const_interval!(-1.2, -0.2).trunc(), const_interval!(-1.0, 0.0));
assert_eq!(const_interval!(-1.8, -0.8).trunc(), const_interval!(-1.0, 0.0));
assert_eq!(Interval::EMPTY.trunc(), Interval::EMPTY);
assert_eq!(Interval::ENTIRE.trunc(), Interval::ENTIRE);

See also: Interval::ceil, Interval::floor.

source§

impl Interval

source

pub fn inf(self) -> f64

Returns the lower bound of self.

The lower bound of an interval $𝒙$ is:

$$ \inf(𝒙) = \begin{cases} +∞ & \if 𝒙 = βˆ…, \\ a & \if 𝒙 = [a, b]. \end{cases} $$

The exact value is returned. When $a = 0$, -0.0 is returned.

Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).inf(), -2.0);
assert_eq!(Interval::EMPTY.inf(), f64::INFINITY);
assert_eq!(Interval::ENTIRE.inf(), f64::NEG_INFINITY);

See also: Interval::sup.

source

pub fn mag(self) -> f64

Returns the magnitude of self if it is nonempty; otherwise, a NaN.

The magnitude of a nonempty interval $𝒙 = [a, b]$ is:

$$ \begin{align*} \mag(𝒙) &= \sup \set{|x| ∣ x ∈ 𝒙} \\ &= \max \set{|a|, |b|}. \end{align*} $$

The exact value is returned.

Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).mag(), 3.0);
assert!(Interval::EMPTY.mag().is_nan());
assert_eq!(Interval::ENTIRE.mag(), f64::INFINITY);

See also: Interval::mig.

source

pub fn mid(self) -> f64

Returns the midpoint of self if it is nonempty; otherwise, a NaN.

The midpoint of a nonempty interval $𝒙 = [a, b]$ is:

$$ \mid(𝒙) = \frac{a + b}{2}. $$

As an approximation in f64, it returns:

  • 0.0, if $\self = [-∞, +∞]$;
  • f64::MIN, if $\self = [-∞, b]$, where $b ∈ \R$;
  • f64::MAX, if $\self = [a, +∞]$, where $a ∈ \R$;
  • otherwise, the closest f64 number to $\mid(\self)$, away from zero in case of ties.
Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).mid(), 0.5);
assert_eq!(const_interval!(f64::NEG_INFINITY, 3.0).mid(), f64::MIN);
assert_eq!(const_interval!(-2.0, f64::INFINITY).mid(), f64::MAX);
assert!(Interval::EMPTY.mid().is_nan());
assert_eq!(Interval::ENTIRE.mid(), 0.0);

See also: Interval::rad.

source

pub fn mig(self) -> f64

Returns the mignitude of self if it is nonempty; otherwise, a NaN.

The mignitude of a nonempty interval $𝒙 = [a, b]$ is:

$$ \begin{align*} \mig(𝒙) &= \inf \set{|x| ∣ x ∈ 𝒙} \\ &= \begin{cases} \min \set{|a|, |b|} & \if \sgn(a) = \sgn(b), \\ 0 & \otherwise. \end{cases} \end{align*} $$

The exact value is returned.

Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).mig(), 0.0);
assert_eq!(const_interval!(2.0, 3.0).mig(), 2.0);
assert!(Interval::EMPTY.mig().is_nan());
assert_eq!(Interval::ENTIRE.mig(), 0.0);

See also: Interval::mag.

source

pub fn rad(self) -> f64

Returns the radius of self if it is nonempty; otherwise, a NaN.

The radius of a nonempty interval $𝒙 = [a, b]$ is:

$$ \rad(𝒙) = \frac{b - a}{2}. $$

As an approximation in f64, it returns the least f64 number r that satisfies $\self βŠ† [πš– - πš›, πš– + πš›]$, where m is the midpoint returned by Self::mid.

Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).rad(), 2.5);
assert!(Interval::EMPTY.rad().is_nan());
assert_eq!(Interval::ENTIRE.rad(), f64::INFINITY);

See also: Interval::mid.

source

pub fn sup(self) -> f64

Returns the upper bound of self.

The upper bound of an interval $𝒙$ is:

$$ \sup(𝒙) = \begin{cases} -∞ & \if 𝒙 = βˆ…, \\ b & \if 𝒙 = [a, b]. \end{cases} $$

The exact value is returned. When $b = 0$, 0.0 (the positive zero) is returned.

Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).sup(), 3.0);
assert_eq!(Interval::EMPTY.sup(), f64::NEG_INFINITY);
assert_eq!(Interval::ENTIRE.sup(), f64::INFINITY);

See also: Interval::inf.

source

pub fn wid(self) -> f64

Returns the width of self if it is nonempty; otherwise, a NaN.

The width of a nonempty interval $𝒙 = [a, b]$ is:

$$ \wid(𝒙) = b - a. $$

As an approximation in f64, it returns the closest f64 number toward $+∞$.

Examples
use inari::*;
assert_eq!(const_interval!(-2.0, 3.0).wid(), 5.0);
assert_eq!(const_interval!(-1.0, f64::MAX).wid(), f64::INFINITY);
assert!(Interval::EMPTY.wid().is_nan());
assert_eq!(Interval::ENTIRE.wid(), f64::INFINITY);
source§

impl Interval

source

pub fn overlap(self, rhs: Self) -> Overlap

Returns the overlapping state of self and rhs. See Overlap for the possible states to be returned.

source§

impl Interval

source

pub fn convex_hull(self, rhs: Self) -> Self

Returns $\hull(\self βˆͺ \rhs)$, the tightest interval that contains both self and rhs as its subsets.

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$$βˆ…$$[c, d]$
$\self = [a, b]$$[a, b]$$[\min \set{a, c}, \max \set{b, d}]$
source

pub fn intersection(self, rhs: Self) -> Self

Returns $\self ∩ \rhs$, the intersection of self and rhs.

$\rhs = βˆ…$$\rhs = [c, d]$
$\self = βˆ…$$βˆ…$$βˆ…$
$\self = [a, b]$$βˆ…$$[\max \set{a, c}, \min \set{b, d}]$

Trait Implementations§

source§

impl Add<&Interval> for &Interval

Β§

type Output = <Interval as Add<Interval>>::Output

The resulting type after applying the + operator.
source§

fn add(self, other: &Interval) -> <Interval as Add<Interval>>::Output

Performs the + operation. Read more
source§

impl Add<&Interval> for Interval

Β§

type Output = <Interval as Add<Interval>>::Output

The resulting type after applying the + operator.
source§

fn add(self, other: &Interval) -> <Interval as Add<Interval>>::Output

Performs the + operation. Read more
source§

impl<'a> Add<Interval> for &'a Interval

Β§

type Output = <Interval as Add<Interval>>::Output

The resulting type after applying the + operator.
source§

fn add(self, other: Interval) -> <Interval as Add<Interval>>::Output

Performs the + operation. Read more
source§

impl Add<Interval> for Interval

Β§

type Output = Interval

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self

Performs the + operation. Read more
source§

impl AddAssign<&Interval> for Interval

source§

fn add_assign(&mut self, other: &Interval)

Performs the += operation. Read more
source§

impl AddAssign<Interval> for Interval

source§

fn add_assign(&mut self, rhs: Self)

Performs the += operation. Read more
source§

impl Clone for Interval

source§

fn clone(&self) -> Interval

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Interval

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Interval

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Div<&Interval> for &Interval

Β§

type Output = <Interval as Div<Interval>>::Output

The resulting type after applying the / operator.
source§

fn div(self, other: &Interval) -> <Interval as Div<Interval>>::Output

Performs the / operation. Read more
source§

impl Div<&Interval> for Interval

Β§

type Output = <Interval as Div<Interval>>::Output

The resulting type after applying the / operator.
source§

fn div(self, other: &Interval) -> <Interval as Div<Interval>>::Output

Performs the / operation. Read more
source§

impl<'a> Div<Interval> for &'a Interval

Β§

type Output = <Interval as Div<Interval>>::Output

The resulting type after applying the / operator.
source§

fn div(self, other: Interval) -> <Interval as Div<Interval>>::Output

Performs the / operation. Read more
source§

impl Div<Interval> for Interval

Β§

type Output = Interval

The resulting type after applying the / operator.
source§

fn div(self, rhs: Self) -> Self

Performs the / operation. Read more
source§

impl DivAssign<&Interval> for Interval

source§

fn div_assign(&mut self, other: &Interval)

Performs the /= operation. Read more
source§

impl DivAssign<Interval> for Interval

source§

fn div_assign(&mut self, rhs: Self)

Performs the /= operation. Read more
source§

impl FromStr for Interval

Β§

type Err = IntervalError

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<Self>

Parses a string s to return a value of this type. Read more
source§

impl Hash for Interval

source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl LowerExp for Interval

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter.
source§

impl LowerHex for Interval

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter.
source§

impl Mul<&Interval> for &Interval

Β§

type Output = <Interval as Mul<Interval>>::Output

The resulting type after applying the * operator.
source§

fn mul(self, other: &Interval) -> <Interval as Mul<Interval>>::Output

Performs the * operation. Read more
source§

impl Mul<&Interval> for Interval

Β§

type Output = <Interval as Mul<Interval>>::Output

The resulting type after applying the * operator.
source§

fn mul(self, other: &Interval) -> <Interval as Mul<Interval>>::Output

Performs the * operation. Read more
source§

impl<'a> Mul<Interval> for &'a Interval

Β§

type Output = <Interval as Mul<Interval>>::Output

The resulting type after applying the * operator.
source§

fn mul(self, other: Interval) -> <Interval as Mul<Interval>>::Output

Performs the * operation. Read more
source§

impl Mul<Interval> for Interval

Β§

type Output = Interval

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Self) -> Self

Performs the * operation. Read more
source§

impl MulAssign<&Interval> for Interval

source§

fn mul_assign(&mut self, other: &Interval)

Performs the *= operation. Read more
source§

impl MulAssign<Interval> for Interval

source§

fn mul_assign(&mut self, rhs: Self)

Performs the *= operation. Read more
source§

impl Neg for &Interval

Β§

type Output = <Interval as Neg>::Output

The resulting type after applying the - operator.
source§

fn neg(self) -> <Interval as Neg>::Output

Performs the unary - operation. Read more
source§

impl Neg for Interval

Β§

type Output = Interval

The resulting type after applying the - operator.
source§

fn neg(self) -> Self

Performs the unary - operation. Read more
source§

impl PartialEq<Interval> for Interval

source§

fn eq(&self, rhs: &Self) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Sub<&Interval> for &Interval

Β§

type Output = <Interval as Sub<Interval>>::Output

The resulting type after applying the - operator.
source§

fn sub(self, other: &Interval) -> <Interval as Sub<Interval>>::Output

Performs the - operation. Read more
source§

impl Sub<&Interval> for Interval

Β§

type Output = <Interval as Sub<Interval>>::Output

The resulting type after applying the - operator.
source§

fn sub(self, other: &Interval) -> <Interval as Sub<Interval>>::Output

Performs the - operation. Read more
source§

impl<'a> Sub<Interval> for &'a Interval

Β§

type Output = <Interval as Sub<Interval>>::Output

The resulting type after applying the - operator.
source§

fn sub(self, other: Interval) -> <Interval as Sub<Interval>>::Output

Performs the - operation. Read more
source§

impl Sub<Interval> for Interval

Β§

type Output = Interval

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self

Performs the - operation. Read more
source§

impl SubAssign<&Interval> for Interval

source§

fn sub_assign(&mut self, other: &Interval)

Performs the -= operation. Read more
source§

impl SubAssign<Interval> for Interval

source§

fn sub_assign(&mut self, rhs: Self)

Performs the -= operation. Read more
source§

impl TryFrom<(f64, f64)> for Interval

Β§

type Error = IntervalError

The type returned in the event of a conversion error.
source§

fn try_from((a, b): (f64, f64)) -> Result<Self>

Performs the conversion.
source§

impl Copy for Interval

source§

impl Eq for Interval

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Az for T

source§

fn az<Dst>(self) -> Dstwhere T: Cast<Dst>,

Casts the value.
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Src, Dst> CastFrom<Src> for Dstwhere Src: Cast<Dst>,

source§

fn cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> CheckedAs for T

source§

fn checked_as<Dst>(self) -> Option<Dst>where T: CheckedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere Src: CheckedCast<Dst>,

source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> OverflowingAs for T

source§

fn overflowing_as<Dst>(self) -> (Dst, bool)where T: OverflowingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere Src: OverflowingCast<Dst>,

source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
source§

impl<T> SaturatingAs for T

source§

fn saturating_as<Dst>(self) -> Dstwhere T: SaturatingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere Src: SaturatingCast<Dst>,

source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> ToOwned for Twhere T: Clone,

Β§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

Β§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

Β§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> UnwrappedAs for T

source§

fn unwrapped_as<Dst>(self) -> Dstwhere T: UnwrappedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dstwhere Src: UnwrappedCast<Dst>,

source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> WrappingAs for T

source§

fn wrapping_as<Dst>(self) -> Dstwhere T: WrappingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> WrappingCastFrom<Src> for Dstwhere Src: WrappingCast<Dst>,

source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.