pub trait Euclid:
Sized
+ Div<Self, Output = Self>
+ Rem<Self, Output = Self> {
// Required methods
fn div_euclid(&self, v: &Self) -> Self;
fn rem_euclid(&self, v: &Self) -> Self;
// Provided method
fn div_rem_euclid(&self, v: &Self) -> (Self, Self) { ... }
}Required Methods§
Sourcefn div_euclid(&self, v: &Self) -> Self
fn div_euclid(&self, v: &Self) -> Self
Calculates Euclidean division, the matching method for rem_euclid.
This computes the integer n such that
self = n * v + self.rem_euclid(v).
In other words, the result is self / v rounded to the integer n
such that self >= n * v.
§Examples
use num_traits::Euclid;
let a: i32 = 7;
let b: i32 = 4;
assert_eq!(Euclid::div_euclid(&a, &b), 1); // 7 > 4 * 1
assert_eq!(Euclid::div_euclid(&-a, &b), -2); // -7 >= 4 * -2
assert_eq!(Euclid::div_euclid(&a, &-b), -1); // 7 >= -4 * -1
assert_eq!(Euclid::div_euclid(&-a, &-b), 2); // -7 >= -4 * 2Sourcefn rem_euclid(&self, v: &Self) -> Self
fn rem_euclid(&self, v: &Self) -> Self
Calculates the least nonnegative remainder of self (mod v).
In particular, the return value r satisfies 0.0 <= r < v.abs() in
most cases. However, due to a floating point round-off error it can
result in r == v.abs(), violating the mathematical definition, if
self is much smaller than v.abs() in magnitude and self < 0.0.
This result is not an element of the function’s codomain, but it is the
closest floating point number in the real numbers and thus fulfills the
property self == self.div_euclid(v) * v + self.rem_euclid(v)
approximatively.
§Examples
use num_traits::Euclid;
let a: i32 = 7;
let b: i32 = 4;
assert_eq!(Euclid::rem_euclid(&a, &b), 3);
assert_eq!(Euclid::rem_euclid(&-a, &b), 1);
assert_eq!(Euclid::rem_euclid(&a, &-b), 3);
assert_eq!(Euclid::rem_euclid(&-a, &-b), 1);Provided Methods§
Sourcefn div_rem_euclid(&self, v: &Self) -> (Self, Self)
fn div_rem_euclid(&self, v: &Self) -> (Self, Self)
Returns both the quotient and remainder from Euclidean division.
By default, it internally calls both Euclid::div_euclid and Euclid::rem_euclid,
but it can be overridden in order to implement some optimization.
§Examples
let x = 5u8;
let y = 3u8;
let div = Euclid::div_euclid(&x, &y);
let rem = Euclid::rem_euclid(&x, &y);
assert_eq!((div, rem), Euclid::div_rem_euclid(&x, &y));Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl Euclid for f32
Available on non-crate feature std only.
impl Euclid for f32
std only.fn div_euclid(&self, v: &f32) -> f32
fn rem_euclid(&self, v: &f32) -> f32
Source§impl Euclid for f64
Available on non-crate feature std only.
impl Euclid for f64
std only.