[][src]Trait float_eq::FloatEq

pub trait FloatEq<Rhs: ?Sized = Self> {
    type Epsilon: ?Sized + FloatEqUlpsEpsilon;
    fn eq_abs(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool;
fn eq_rmax(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool;
fn eq_rmin(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool;
fn eq_r1st(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool;
fn eq_r2nd(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool;
fn eq_ulps(
        &self,
        other: &Rhs,
        max_diff: &UlpsEpsilon<Self::Epsilon>
    ) -> bool; fn ne_abs(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn eq_rel(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn ne_rel(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn ne_rmax(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn ne_rmin(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn ne_r1st(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn ne_r2nd(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool { ... }
fn ne_ulps(
        &self,
        other: &Rhs,
        max_diff: &UlpsEpsilon<Self::Epsilon>
    ) -> bool { ... } }

Compare IEEE floating point values for equality using per-field thresholds.

This trait is used in the implementation of the float_eq! and assert_float_eq! families of macros.

Derivable

This trait can be used with #[derive]. The easiest way to do so is to use the #[derive_float_eq] helper macro, see the top level docs for example usage.

If you wish to derive this trait by itself, you must first implement FloatEqUlpsEpsilon, which may also be derived. You will also need a #[float_eq] attribute and provide ulps_epsilon, which should match the name of the UlpsEpsilon type. Two instances are equal if all fields are equal, and not equal if any are not. This trait may not be derived for enums or generic structs at present.

#[derive(Debug, Clone, Copy, PartialEq, FloatEqUlpsEpsilon, FloatEq)]
#[float_eq(ulps_epsilon = "PointUlps")]
struct Point {
    x: f32,
    y: f32,
}

let a = Point { x: 1.0, y: -2.0 };
let b = Point { x: 1.5, y: -3.0 };
assert!(a.eq_abs(&b, &Point { x: 0.5, y: 1.0 }));
assert!(a.ne_abs(&b, &Point { x: 0.4, y: 1.0 }));
assert!(a.ne_abs(&b, &Point { x: 0.5, y: 0.9 }));

let c = Point { x: 1.000_000_1, y: -2.000_000_5 };
assert!(a.eq_ulps(&c, &PointUlps { x: 1, y: 2 }));
assert!(a.ne_ulps(&c, &PointUlps { x: 0, y: 2 }));
assert!(a.ne_ulps(&c, &PointUlps { x: 1, y: 1 }));

How can I implement FloatEq?

You will need to implement FloatEqUlpsEpsilon for your type. Implementation is then usually a matter of calling through to an underlying FloatEq method for each field in turn. If not, you will need to take a close look at the descriptions of the algorithms on a method by method basis:

#[derive(Debug, Copy, Clone, PartialEq)]
struct MyComplex32 {
    re: f32,
    im: f32,
}

#[derive(Debug, Copy, Clone, PartialEq)]
struct MyComplex32Ulps {
    re: UlpsEpsilon<f32>,
    im: UlpsEpsilon<f32>,
}

impl FloatEqUlpsEpsilon for MyComplex32 {
    type UlpsEpsilon = MyComplex32Ulps;   
}

impl FloatEq for MyComplex32 {
    type Epsilon = MyComplex32;

    fn eq_abs(&self, other: &Self, max_diff: &MyComplex32) -> bool {
        self.re.eq_abs(&other.re, &max_diff.re) && self.im.eq_abs(&other.im, &max_diff.im)
    }

    fn eq_rmax(&self, other: &Self, max_diff: &MyComplex32) -> bool {
        self.re.eq_rmax(&other.re, &max_diff.re) && self.im.eq_rmax(&other.im, &max_diff.im)
    }

    fn eq_rmin(&self, other: &Self, max_diff: &MyComplex32) -> bool {
        self.re.eq_rmin(&other.re, &max_diff.re) && self.im.eq_rmin(&other.im, &max_diff.im)
    }

    fn eq_r1st(&self, other: &Self, max_diff: &MyComplex32) -> bool {
        self.re.eq_r1st(&other.re, &max_diff.re) && self.im.eq_r1st(&other.im, &max_diff.im)
    }

    fn eq_r2nd(&self, other: &Self, max_diff: &MyComplex32) -> bool {
        self.re.eq_r2nd(&other.re, &max_diff.re) && self.im.eq_r2nd(&other.im, &max_diff.im)
    }

    fn eq_ulps(&self, other: &Self, max_diff: &UlpsEpsilon<MyComplex32>) -> bool {
        self.re.eq_ulps(&other.re, &max_diff.re) && self.im.eq_ulps(&other.im, &max_diff.im)
    }
}

let a = MyComplex32 { re: 1.0, im: 2.000_003_6, };
let b = MyComplex32 { re: 1.000_000_1, im: 2.0, };

assert!(a.eq_abs(&b, &MyComplex32 { re: 0.000_000_15, im: 0.000_003_6 }));
assert!(a.ne_abs(&b, &MyComplex32 { re: 0.000_000_05, im: 0.000_003_6 }));
assert!(a.ne_abs(&b, &MyComplex32 { re: 0.000_000_15, im: 0.000_003_5 }));

assert!(a.eq_rel(&b, &MyComplex32 { re: 0.000_000_15, im: 0.000_001_8 }));
assert!(a.ne_rel(&b, &MyComplex32 { re: 0.000_000_05, im: 0.000_001_8 }));
assert!(a.ne_rel(&b, &MyComplex32 { re: 0.000_000_15, im: 0.000_001_7 }));

assert!(a.eq_ulps(&b, &MyComplex32Ulps { re: 1, im: 15 }));
assert!(a.ne_ulps(&b, &MyComplex32Ulps { re: 0, im: 15 }));
assert!(a.ne_ulps(&b, &MyComplex32Ulps { re: 1, im: 14 }));

Examples

assert!(4.0_f32.eq_abs(&4.000_001_5, &0.000_001_6));
assert!(4.0_f32.ne_abs(&4.000_001_5, &0.000_001_4));

assert!(4.0_f32.eq_rel(&4.000_001_5, &0.000_000_4));
assert!(4.0_f32.ne_rel(&4.000_001_5, &0.000_000_3));

assert!(4.0_f32.eq_ulps(&4.000_001_5, &3));
assert!(4.0_f32.ne_ulps(&4.000_001_5, &2));

Associated Types

type Epsilon: ?Sized + FloatEqUlpsEpsilon

Type of the maximum allowed difference between two values for them to be considered equal.

Loading content...

Required methods

fn eq_abs(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is equal to other, using an absolute epsilon comparison.

Implementations should be the equivalent of:

// the PartialEq check covers equality of infinities
self == other || (self - other).abs().le(max_diff)

fn eq_rmax(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is equal to other, using a relative epsilon comparison, scaled to the granularity of the input with the largest magnitude.

The implementation should be the equivalent of:

// the PartialEq check covers equality of infinities
self == other || {
    let largest = self.abs().max(other.abs());
    let epsilon = largest * max_diff;
    (self - other).abs() <= epsilon
}

fn eq_rmin(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is equal to other, using a relative epsilon comparison, scaled to the granularity of the input with the smallest magnitude.

The implementation should be the equivalent of:

// the PartialEq check covers equality of infinities
self == other || {
    let smallest = self.abs().min(other.abs());
    let epsilon = smallest * max_diff;
    (self - other).abs() <= epsilon
}

fn eq_r1st(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is equal to other, using a relative epsilon comparison, scaled to the granularity of the first input.

The implementation should be the equivalent of:

// the PartialEq check covers equality of infinities
self == other || {
    let epsilon = self.abs() * max_diff;
    (self - other).abs() <= epsilon
}

fn eq_r2nd(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is equal to other, using a relative epsilon comparison, scaled to the granularity of the input with the largest magnitude.

The implementation should be the equivalent of:

// the PartialEq check covers equality of infinities
self == other || {
    let epsilon = other.abs() * max_diff;
    (self - other).abs() <= epsilon
}

fn eq_ulps(&self, other: &Rhs, max_diff: &UlpsEpsilon<Self::Epsilon>) -> bool

Check whether self is equal to other, using an ULPs comparison.

The implementation should be the equivalent of:

if self.is_nan() || other.is_nan() {
    false // NaNs are never equal
}
else if self.is_sign_positive() != other.is_sign_positive() {
    self == other // account for zero == negative zero
} else {
    let a = self.to_bits();
    let b = other.to_bits();
    let max = a.max(b);
    let min = a.min(b);
    (max - min).le(max_diff)
}
Loading content...

Provided methods

fn ne_abs(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is not equal to other, using an absolute epsilon comparison.

Equal to !self.eq_abs(other, max_diff), there is no need to reimplement this for your own types.

fn eq_rel(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is equal to other, using a relative epsilon comparison.

Equal to self.eq_rmax(other, max_diff), there is no need to reimplement this for your own types.

fn ne_rel(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is not equal to other, using a relative epsilon comparison.

Equal to !self.eq_rel(other, max_diff), there is no need to reimplement this for your own types.

fn ne_rmax(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is not equal to other, using a relative epsilon comparison.

Equal to !self.eq_rmax(other, max_diff), there is no need to reimplement this for your own types.

fn ne_rmin(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is not equal to other, using a relative epsilon comparison.

Equal to !self.eq_rmin(other, max_diff), there is no need to reimplement this for your own types.

fn ne_r1st(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is not equal to other, using a relative epsilon comparison.

Equal to !self.eq_r1st(other, max_diff), there is no need to reimplement this for your own types.

fn ne_r2nd(&self, other: &Rhs, max_diff: &Self::Epsilon) -> bool

Check whether self is not equal to other, using a relative epsilon comparison.

Equal to !self.eq_r2nd(other, max_diff), there is no need to reimplement this for your own types.

fn ne_ulps(&self, other: &Rhs, max_diff: &UlpsEpsilon<Self::Epsilon>) -> bool

Check whether self is not equal to other, using an ULPs comparison.

Equal to !self.eq_ulps(other, max_diff), there is no need to reimplement this for your own types.

Loading content...

Implementations on Foreign Types

impl<A, B> FloatEq<[B; 0]> for [A; 0] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 0]

impl<A, B> FloatEq<[B; 1]> for [A; 1] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 1]

impl<A, B> FloatEq<[B; 2]> for [A; 2] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 2]

impl<A, B> FloatEq<[B; 3]> for [A; 3] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 3]

impl<A, B> FloatEq<[B; 4]> for [A; 4] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 4]

impl<A, B> FloatEq<[B; 5]> for [A; 5] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 5]

impl<A, B> FloatEq<[B; 6]> for [A; 6] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 6]

impl<A, B> FloatEq<[B; 7]> for [A; 7] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 7]

impl<A, B> FloatEq<[B; 8]> for [A; 8] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 8]

impl<A, B> FloatEq<[B; 9]> for [A; 9] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 9]

impl<A, B> FloatEq<[B; 10]> for [A; 10] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 10]

impl<A, B> FloatEq<[B; 11]> for [A; 11] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 11]

impl<A, B> FloatEq<[B; 12]> for [A; 12] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 12]

impl<A, B> FloatEq<[B; 13]> for [A; 13] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 13]

impl<A, B> FloatEq<[B; 14]> for [A; 14] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 14]

impl<A, B> FloatEq<[B; 15]> for [A; 15] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 15]

impl<A, B> FloatEq<[B; 16]> for [A; 16] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 16]

impl<A, B> FloatEq<[B; 17]> for [A; 17] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 17]

impl<A, B> FloatEq<[B; 18]> for [A; 18] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 18]

impl<A, B> FloatEq<[B; 19]> for [A; 19] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 19]

impl<A, B> FloatEq<[B; 20]> for [A; 20] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 20]

impl<A, B> FloatEq<[B; 21]> for [A; 21] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 21]

impl<A, B> FloatEq<[B; 22]> for [A; 22] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 22]

impl<A, B> FloatEq<[B; 23]> for [A; 23] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 23]

impl<A, B> FloatEq<[B; 24]> for [A; 24] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 24]

impl<A, B> FloatEq<[B; 25]> for [A; 25] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 25]

impl<A, B> FloatEq<[B; 26]> for [A; 26] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 26]

impl<A, B> FloatEq<[B; 27]> for [A; 27] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 27]

impl<A, B> FloatEq<[B; 28]> for [A; 28] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 28]

impl<A, B> FloatEq<[B; 29]> for [A; 29] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 29]

impl<A, B> FloatEq<[B; 30]> for [A; 30] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 30]

impl<A, B> FloatEq<[B; 31]> for [A; 31] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 31]

impl<A, B> FloatEq<[B; 32]> for [A; 32] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon; 32]

impl<A: ?Sized, B: ?Sized, '_, '_> FloatEq<&'_ B> for &'_ A where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A: ?Sized, B: ?Sized, '_, '_> FloatEq<&'_ mut B> for &'_ A where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A: ?Sized, B: ?Sized, '_, '_> FloatEq<&'_ B> for &'_ mut A where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A: ?Sized, B: ?Sized, '_, '_> FloatEq<&'_ mut B> for &'_ mut A where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<T: FloatEq> FloatEq<Option<T>> for Option<T> where
    T::Epsilon: Sized,
    UlpsEpsilon<T::Epsilon>: Sized
[src]

type Epsilon = Option<T::Epsilon>

impl<A, B> FloatEq<Cell<B>> for Cell<A> where
    A: FloatEq<B> + Copy,
    B: Copy
[src]

type Epsilon = A::Epsilon

impl<A: ?Sized, B: ?Sized> FloatEq<RefCell<B>> for RefCell<A> where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A, B> FloatEq<[B]> for [A] where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = [A::Epsilon]

impl FloatEq<f32> for f32[src]

type Epsilon = Self

impl FloatEq<f64> for f64[src]

type Epsilon = Self

impl FloatEq<()> for ()[src]

type Epsilon = ()

impl<A> FloatEq<(A,)> for (A,) where
    A: FloatEq + ?Sized,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon,)

impl<A: FloatEq, B> FloatEq<(A, B)> for (A, B) where
    B: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon)

impl<A: FloatEq, B: FloatEq, C> FloatEq<(A, B, C)> for (A, B, C) where
    C: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D> FloatEq<(A, B, C, D)> for (A, B, C, D) where
    D: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E> FloatEq<(A, B, C, D, E)> for (A, B, C, D, E) where
    E: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F> FloatEq<(A, B, C, D, E, F)> for (A, B, C, D, E, F) where
    F: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F: FloatEq, G> FloatEq<(A, B, C, D, E, F, G)> for (A, B, C, D, E, F, G) where
    G: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    G::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized,
    UlpsEpsilon<G::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon, G::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F: FloatEq, G: FloatEq, H> FloatEq<(A, B, C, D, E, F, G, H)> for (A, B, C, D, E, F, G, H) where
    H: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    G::Epsilon: Sized,
    H::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized,
    UlpsEpsilon<G::Epsilon>: Sized,
    UlpsEpsilon<H::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon, G::Epsilon, H::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F: FloatEq, G: FloatEq, H: FloatEq, I> FloatEq<(A, B, C, D, E, F, G, H, I)> for (A, B, C, D, E, F, G, H, I) where
    I: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    G::Epsilon: Sized,
    H::Epsilon: Sized,
    I::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized,
    UlpsEpsilon<G::Epsilon>: Sized,
    UlpsEpsilon<H::Epsilon>: Sized,
    UlpsEpsilon<I::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon, G::Epsilon, H::Epsilon, I::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F: FloatEq, G: FloatEq, H: FloatEq, I: FloatEq, J> FloatEq<(A, B, C, D, E, F, G, H, I, J)> for (A, B, C, D, E, F, G, H, I, J) where
    J: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    G::Epsilon: Sized,
    H::Epsilon: Sized,
    I::Epsilon: Sized,
    J::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized,
    UlpsEpsilon<G::Epsilon>: Sized,
    UlpsEpsilon<H::Epsilon>: Sized,
    UlpsEpsilon<I::Epsilon>: Sized,
    UlpsEpsilon<J::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon, G::Epsilon, H::Epsilon, I::Epsilon, J::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F: FloatEq, G: FloatEq, H: FloatEq, I: FloatEq, J: FloatEq, K> FloatEq<(A, B, C, D, E, F, G, H, I, J, K)> for (A, B, C, D, E, F, G, H, I, J, K) where
    K: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    G::Epsilon: Sized,
    H::Epsilon: Sized,
    I::Epsilon: Sized,
    J::Epsilon: Sized,
    K::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized,
    UlpsEpsilon<G::Epsilon>: Sized,
    UlpsEpsilon<H::Epsilon>: Sized,
    UlpsEpsilon<I::Epsilon>: Sized,
    UlpsEpsilon<J::Epsilon>: Sized,
    UlpsEpsilon<K::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon, G::Epsilon, H::Epsilon, I::Epsilon, J::Epsilon, K::Epsilon)

impl<A: FloatEq, B: FloatEq, C: FloatEq, D: FloatEq, E: FloatEq, F: FloatEq, G: FloatEq, H: FloatEq, I: FloatEq, J: FloatEq, K: FloatEq, L> FloatEq<(A, B, C, D, E, F, G, H, I, J, K, L)> for (A, B, C, D, E, F, G, H, I, J, K, L) where
    L: FloatEq + ?Sized,
    A::Epsilon: Sized,
    B::Epsilon: Sized,
    C::Epsilon: Sized,
    D::Epsilon: Sized,
    E::Epsilon: Sized,
    F::Epsilon: Sized,
    G::Epsilon: Sized,
    H::Epsilon: Sized,
    I::Epsilon: Sized,
    J::Epsilon: Sized,
    K::Epsilon: Sized,
    L::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized,
    UlpsEpsilon<B::Epsilon>: Sized,
    UlpsEpsilon<C::Epsilon>: Sized,
    UlpsEpsilon<D::Epsilon>: Sized,
    UlpsEpsilon<E::Epsilon>: Sized,
    UlpsEpsilon<F::Epsilon>: Sized,
    UlpsEpsilon<G::Epsilon>: Sized,
    UlpsEpsilon<H::Epsilon>: Sized,
    UlpsEpsilon<I::Epsilon>: Sized,
    UlpsEpsilon<J::Epsilon>: Sized,
    UlpsEpsilon<K::Epsilon>: Sized,
    UlpsEpsilon<L::Epsilon>: Sized
[src]

type Epsilon = (A::Epsilon, B::Epsilon, C::Epsilon, D::Epsilon, E::Epsilon, F::Epsilon, G::Epsilon, H::Epsilon, I::Epsilon, J::Epsilon, K::Epsilon, L::Epsilon)

impl<A: ?Sized, B: ?Sized> FloatEq<Arc<B>> for Arc<A> where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A: ?Sized, B: ?Sized> FloatEq<Box<B>> for Box<A> where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A: ?Sized, B: ?Sized> FloatEq<Rc<B>> for Rc<A> where
    A: FloatEq<B>, 
[src]

type Epsilon = A::Epsilon

impl<A, B> FloatEq<Vec<B>> for Vec<A> where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = Vec<A::Epsilon>

impl<A, B> FloatEq<VecDeque<B>> for VecDeque<A> where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = VecDeque<A::Epsilon>

impl<A, B> FloatEq<LinkedList<B>> for LinkedList<A> where
    A: FloatEq<B>,
    A::Epsilon: Sized,
    UlpsEpsilon<A::Epsilon>: Sized
[src]

type Epsilon = LinkedList<A::Epsilon>

impl<K, VA, VB, S> FloatEq<HashMap<K, VB, S>> for HashMap<K, VA, S> where
    K: Eq + Hash,
    S: BuildHasher,
    VA: FloatEq<VB>,
    VA::Epsilon: Sized,
    UlpsEpsilon<VA::Epsilon>: Sized
[src]

type Epsilon = HashMap<K, VA::Epsilon, S>

impl<K, VA, VB> FloatEq<BTreeMap<K, VB>> for BTreeMap<K, VA> where
    K: Eq + Ord,
    VA: FloatEq<VB>,
    VA::Epsilon: Sized,
    UlpsEpsilon<VA::Epsilon>: Sized
[src]

type Epsilon = BTreeMap<K, VA::Epsilon>

impl<T: FloatEq> FloatEq<Complex<T>> for Complex<T> where
    T::Epsilon: Sized,
    UlpsEpsilon<T::Epsilon>: Sized
[src]

type Epsilon = Complex<T::Epsilon>

Loading content...

Implementors

Loading content...