Skip to main content

malachite_float/float/arithmetic/
canonicalize_unit.rs

1// Copyright © 2026 Mikhail Hogrefe
2//
3// This file is part of Malachite.
4//
5// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
6// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
7// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
8
9use crate::Float;
10use malachite_base::num::arithmetic::traits::{
11    Abs, AbsAssign, CanonicalizeUnit, CanonicalizeUnitAssign,
12};
13
14impl CanonicalizeUnit for Float {
15    type Output = Self;
16
17    /// Brings a [`Float`] into canonical unit form, taking it by value. The canonical unit form of
18    /// a [`Float`] is its absolute value; negative zero becomes zero and NaN stays NaN.
19    ///
20    /// # Worst-case complexity
21    /// Constant time and additional memory.
22    ///
23    /// # Examples
24    /// ```
25    /// use malachite_base::num::arithmetic::traits::CanonicalizeUnit;
26    /// use malachite_base::num::basic::traits::{NegativeZero, Zero};
27    /// use malachite_float::{ComparableFloat, Float};
28    ///
29    /// assert_eq!(Float::from(-1.5).canonicalize_unit(), 1.5);
30    /// assert_eq!(
31    ///     ComparableFloat(Float::NEGATIVE_ZERO.canonicalize_unit()),
32    ///     ComparableFloat(Float::ZERO)
33    /// );
34    /// ```
35    #[inline]
36    fn canonicalize_unit(self) -> Self {
37        self.abs()
38    }
39}
40
41impl CanonicalizeUnit for &Float {
42    type Output = Float;
43
44    /// Brings a [`Float`] into canonical unit form, taking it by reference. The canonical unit form
45    /// of a [`Float`] is its absolute value; negative zero becomes zero and NaN stays NaN.
46    ///
47    /// # Worst-case complexity
48    /// $T(n) = O(n)$
49    ///
50    /// $M(n) = O(n)$
51    ///
52    /// where $T$ is time, $M$ is additional memory, and $n$ is `self.significant_bits()`.
53    ///
54    /// # Examples
55    /// ```
56    /// use malachite_base::num::arithmetic::traits::CanonicalizeUnit;
57    /// use malachite_float::Float;
58    ///
59    /// assert_eq!((&Float::from(-1.5)).canonicalize_unit(), 1.5);
60    /// ```
61    #[inline]
62    fn canonicalize_unit(self) -> Float {
63        self.clone().abs()
64    }
65}
66
67impl CanonicalizeUnitAssign for Float {
68    /// Replaces a [`Float`] with its canonical unit form. The canonical unit form of a [`Float`] is
69    /// its absolute value; negative zero becomes zero and NaN stays NaN.
70    ///
71    /// # Worst-case complexity
72    /// Constant time and additional memory.
73    ///
74    /// # Examples
75    /// ```
76    /// use malachite_base::num::arithmetic::traits::CanonicalizeUnitAssign;
77    /// use malachite_float::Float;
78    ///
79    /// let mut x = Float::from(-1.5);
80    /// x.canonicalize_unit_assign();
81    /// assert_eq!(x, 1.5);
82    /// ```
83    #[inline]
84    fn canonicalize_unit_assign(&mut self) {
85        self.abs_assign();
86    }
87}