add saturating rounding functions
This commit is contained in:
parent
0eb2e1f48e
commit
63e1031e24
92
src/lib.rs
92
src/lib.rs
|
@ -2243,6 +2243,98 @@ macro_rules! fixed {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doc_comment! {
|
||||||
|
concat!(r#"
|
||||||
|
Saturating ceil. Rounds towards +∞, saturating on overflow.
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use fixed::frac;
|
||||||
|
use fixed::"#, stringify!($Fixed), r#";
|
||||||
|
type Fix = "#, stringify!($Fixed), r#"<frac::U4>;
|
||||||
|
let two_half = Fix::from_int(5) / 2;
|
||||||
|
assert_eq!(two_half.saturating_ceil(), Fix::from_int(3));"#,
|
||||||
|
if_signed_unsigned!($Signedness, r#"
|
||||||
|
assert_eq!((-two_half).saturating_ceil(), Fix::from_int(-2));"#, ""
|
||||||
|
), r#"
|
||||||
|
assert_eq!(Fix::max_value().saturating_ceil(), Fix::max_value());
|
||||||
|
```
|
||||||
|
"#,
|
||||||
|
),
|
||||||
|
#[inline]
|
||||||
|
pub fn saturating_ceil(self) -> $Fixed<Frac> {
|
||||||
|
let saturated = $Fixed::max_value();
|
||||||
|
let (ceil, overflow) = self.overflowing_ceil();
|
||||||
|
if overflow { saturated } else { ceil }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doc_comment! {
|
||||||
|
concat!(if_signed_unsigned!($Signedness, r#"
|
||||||
|
Saturating floor. Rounds towards −∞, saturating on overflow.
|
||||||
|
|
||||||
|
Overflow can only occur when there are zero integer bits.
|
||||||
|
"#, r#"
|
||||||
|
Saturating floor. Rounds towards −∞. Cannot overflow for unsigned values.
|
||||||
|
"#), r#"
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use fixed::frac;
|
||||||
|
use fixed::"#, stringify!($Fixed), r#";
|
||||||
|
type Fix = "#, stringify!($Fixed), r#"<frac::U4>;
|
||||||
|
let two_half = Fix::from_int(5) / 2;
|
||||||
|
assert_eq!(two_half.saturating_floor(), Fix::from_int(2));"#,
|
||||||
|
if_signed_unsigned!($Signedness, concat!(r#"
|
||||||
|
assert_eq!((-two_half).saturating_floor(), Fix::from_int(-3));
|
||||||
|
type AllFrac = "#, stringify!($Fixed), "<frac::", stringify!($Len), r#">;
|
||||||
|
assert_eq!(AllFrac::min_value().saturating_floor(), AllFrac::min_value());"#), ""
|
||||||
|
), r#"
|
||||||
|
```
|
||||||
|
"#,
|
||||||
|
),
|
||||||
|
#[inline]
|
||||||
|
pub fn saturating_floor(self) -> $Fixed<Frac> {
|
||||||
|
let saturated = $Fixed::min_value();
|
||||||
|
let (floor, overflow) = self.overflowing_floor();
|
||||||
|
if overflow { saturated } else { floor }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doc_comment! {
|
||||||
|
concat!(r#"
|
||||||
|
Saturating round. Rounds to the nearest, with ties rounded away from
|
||||||
|
zero, and saturating on overflow.
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use fixed::frac;
|
||||||
|
use fixed::"#, stringify!($Fixed), r#";
|
||||||
|
type Fix = "#, stringify!($Fixed), r#"<frac::U4>;
|
||||||
|
let two_half = Fix::from_int(5) / 2;
|
||||||
|
assert_eq!(two_half.saturating_round(), Fix::from_int(3));"#,
|
||||||
|
if_signed_unsigned!($Signedness, r#"
|
||||||
|
assert_eq!((-two_half).saturating_round(), Fix::from_int(-3));"#, ""
|
||||||
|
), r#"
|
||||||
|
assert_eq!(Fix::max_value().saturating_round(), Fix::max_value());
|
||||||
|
```
|
||||||
|
"#,
|
||||||
|
),
|
||||||
|
#[inline]
|
||||||
|
pub fn saturating_round(self) -> $Fixed<Frac> {
|
||||||
|
let saturated = if self.to_bits() > 0 {
|
||||||
|
$Fixed::max_value()
|
||||||
|
} else {
|
||||||
|
$Fixed::min_value()
|
||||||
|
};
|
||||||
|
let (round, overflow) = self.overflowing_round();
|
||||||
|
if overflow { saturated } else { round }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
doc_comment! {
|
doc_comment! {
|
||||||
concat!(r#"
|
concat!(r#"
|
||||||
Wrapping ceil. Rounds towards +∞, wrapping on overflow.
|
Wrapping ceil. Rounds towards +∞, wrapping on overflow.
|
||||||
|
|
Loading…
Reference in New Issue