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}