aboutsummaryrefslogtreecommitdiff
path: root/ctr-std/src/f64.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ctr-std/src/f64.rs')
-rw-r--r--ctr-std/src/f64.rs59
1 files changed, 55 insertions, 4 deletions
diff --git a/ctr-std/src/f64.rs b/ctr-std/src/f64.rs
index 6f34f17..a958567 100644
--- a/ctr-std/src/f64.rs
+++ b/ctr-std/src/f64.rs
@@ -315,6 +315,56 @@ impl f64 {
unsafe { intrinsics::fmaf64(self, a, b) }
}
+ /// Calculates Euclidean division, the matching method for `mod_euc`.
+ ///
+ /// This computes the integer `n` such that
+ /// `self = n * rhs + self.mod_euc(rhs)`.
+ /// In other words, the result is `self / rhs` rounded to the integer `n`
+ /// such that `self >= n * rhs`.
+ ///
+ /// ```
+ /// #![feature(euclidean_division)]
+ /// let a: f64 = 7.0;
+ /// let b = 4.0;
+ /// assert_eq!(a.div_euc(b), 1.0); // 7.0 > 4.0 * 1.0
+ /// assert_eq!((-a).div_euc(b), -2.0); // -7.0 >= 4.0 * -2.0
+ /// assert_eq!(a.div_euc(-b), -1.0); // 7.0 >= -4.0 * -1.0
+ /// assert_eq!((-a).div_euc(-b), 2.0); // -7.0 >= -4.0 * 2.0
+ /// ```
+ #[inline]
+ #[unstable(feature = "euclidean_division", issue = "49048")]
+ pub fn div_euc(self, rhs: f64) -> f64 {
+ let q = (self / rhs).trunc();
+ if self % rhs < 0.0 {
+ return if rhs > 0.0 { q - 1.0 } else { q + 1.0 }
+ }
+ q
+ }
+
+ /// Calculates the Euclidean modulo (self mod rhs), which is never negative.
+ ///
+ /// In particular, the result `n` satisfies `0 <= n < rhs.abs()`.
+ ///
+ /// ```
+ /// #![feature(euclidean_division)]
+ /// let a: f64 = 7.0;
+ /// let b = 4.0;
+ /// assert_eq!(a.mod_euc(b), 3.0);
+ /// assert_eq!((-a).mod_euc(b), 1.0);
+ /// assert_eq!(a.mod_euc(-b), 3.0);
+ /// assert_eq!((-a).mod_euc(-b), 1.0);
+ /// ```
+ #[inline]
+ #[unstable(feature = "euclidean_division", issue = "49048")]
+ pub fn mod_euc(self, rhs: f64) -> f64 {
+ let r = self % rhs;
+ if r < 0.0 {
+ r + rhs.abs()
+ } else {
+ r
+ }
+ }
+
/// Takes the reciprocal (inverse) of a number, `1/x`.
///
/// ```
@@ -716,7 +766,7 @@ impl f64 {
unsafe { cmath::atan(self) }
}
- /// Computes the four quadrant arctangent of `self` (`y`) and `other` (`x`).
+ /// Computes the four quadrant arctangent of `self` (`y`) and `other` (`x`) in radians.
///
/// * `x = 0`, `y = 0`: `0`
/// * `x >= 0`: `arctan(y/x)` -> `[-pi/2, pi/2]`
@@ -727,12 +777,13 @@ impl f64 {
/// use std::f64;
///
/// let pi = f64::consts::PI;
- /// // All angles from horizontal right (+x)
- /// // 45 deg counter-clockwise
+ /// // Positive angles measured counter-clockwise
+ /// // from positive x axis
+ /// // -pi/4 radians (45 deg clockwise)
/// let x1 = 3.0_f64;
/// let y1 = -3.0_f64;
///
- /// // 135 deg clockwise
+ /// // 3pi/4 radians (135 deg counter-clockwise)
/// let x2 = -3.0_f64;
/// let y2 = 3.0_f64;
///