Auto merge of #79473 - m-ou-se:clamp-in-core, r=m-ou-se
Move {f32,f64}::clamp to core. `clamp` was recently stabilized (tracking issue: https://github.com/rust-lang/rust/issues/44095). But although `Ord::clamp` was added in `core` (because `Ord` is in `core`), the versions for the `f32` and `f64` primitives were added in `std` (together with `floor`, `sin`, etc.), not in `core` (together with `min`, `max`, `from_bits`, etc.). This change moves them to `core`, such that `clamp` on floats is available in `no_std` programs as well.
This commit is contained in:
commit
c1d5843661
@ -961,4 +961,39 @@ impl f32 {
|
||||
|
||||
left.cmp(&right)
|
||||
}
|
||||
|
||||
/// Restrict a value to a certain interval unless it is NaN.
|
||||
///
|
||||
/// Returns `max` if `self` is greater than `max`, and `min` if `self` is
|
||||
/// less than `min`. Otherwise this returns `self`.
|
||||
///
|
||||
/// Note that this function returns NaN if the initial value was NaN as
|
||||
/// well.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `min > max`, `min` is NaN, or `max` is NaN.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// assert!((-3.0f32).clamp(-2.0, 1.0) == -2.0);
|
||||
/// assert!((0.0f32).clamp(-2.0, 1.0) == 0.0);
|
||||
/// assert!((2.0f32).clamp(-2.0, 1.0) == 1.0);
|
||||
/// assert!((f32::NAN).clamp(-2.0, 1.0).is_nan());
|
||||
/// ```
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "clamp", since = "1.50.0")]
|
||||
#[inline]
|
||||
pub fn clamp(self, min: f32, max: f32) -> f32 {
|
||||
assert!(min <= max);
|
||||
let mut x = self;
|
||||
if x < min {
|
||||
x = min;
|
||||
}
|
||||
if x > max {
|
||||
x = max;
|
||||
}
|
||||
x
|
||||
}
|
||||
}
|
||||
|
@ -975,4 +975,39 @@ impl f64 {
|
||||
|
||||
left.cmp(&right)
|
||||
}
|
||||
|
||||
/// Restrict a value to a certain interval unless it is NaN.
|
||||
///
|
||||
/// Returns `max` if `self` is greater than `max`, and `min` if `self` is
|
||||
/// less than `min`. Otherwise this returns `self`.
|
||||
///
|
||||
/// Note that this function returns NaN if the initial value was NaN as
|
||||
/// well.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `min > max`, `min` is NaN, or `max` is NaN.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// assert!((-3.0f64).clamp(-2.0, 1.0) == -2.0);
|
||||
/// assert!((0.0f64).clamp(-2.0, 1.0) == 0.0);
|
||||
/// assert!((2.0f64).clamp(-2.0, 1.0) == 1.0);
|
||||
/// assert!((f64::NAN).clamp(-2.0, 1.0).is_nan());
|
||||
/// ```
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "clamp", since = "1.50.0")]
|
||||
#[inline]
|
||||
pub fn clamp(self, min: f64, max: f64) -> f64 {
|
||||
assert!(min <= max);
|
||||
let mut x = self;
|
||||
if x < min {
|
||||
x = min;
|
||||
}
|
||||
if x > max {
|
||||
x = max;
|
||||
}
|
||||
x
|
||||
}
|
||||
}
|
||||
|
@ -879,39 +879,4 @@ impl f32 {
|
||||
pub fn atanh(self) -> f32 {
|
||||
0.5 * ((2.0 * self) / (1.0 - self)).ln_1p()
|
||||
}
|
||||
|
||||
/// Restrict a value to a certain interval unless it is NaN.
|
||||
///
|
||||
/// Returns `max` if `self` is greater than `max`, and `min` if `self` is
|
||||
/// less than `min`. Otherwise this returns `self`.
|
||||
///
|
||||
/// Note that this function returns NaN if the initial value was NaN as
|
||||
/// well.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `min > max`, `min` is NaN, or `max` is NaN.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// assert!((-3.0f32).clamp(-2.0, 1.0) == -2.0);
|
||||
/// assert!((0.0f32).clamp(-2.0, 1.0) == 0.0);
|
||||
/// assert!((2.0f32).clamp(-2.0, 1.0) == 1.0);
|
||||
/// assert!((f32::NAN).clamp(-2.0, 1.0).is_nan());
|
||||
/// ```
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "clamp", since = "1.50.0")]
|
||||
#[inline]
|
||||
pub fn clamp(self, min: f32, max: f32) -> f32 {
|
||||
assert!(min <= max);
|
||||
let mut x = self;
|
||||
if x < min {
|
||||
x = min;
|
||||
}
|
||||
if x > max {
|
||||
x = max;
|
||||
}
|
||||
x
|
||||
}
|
||||
}
|
||||
|
@ -882,41 +882,6 @@ impl f64 {
|
||||
0.5 * ((2.0 * self) / (1.0 - self)).ln_1p()
|
||||
}
|
||||
|
||||
/// Restrict a value to a certain interval unless it is NaN.
|
||||
///
|
||||
/// Returns `max` if `self` is greater than `max`, and `min` if `self` is
|
||||
/// less than `min`. Otherwise this returns `self`.
|
||||
///
|
||||
/// Note that this function returns NaN if the initial value was NaN as
|
||||
/// well.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `min > max`, `min` is NaN, or `max` is NaN.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// assert!((-3.0f64).clamp(-2.0, 1.0) == -2.0);
|
||||
/// assert!((0.0f64).clamp(-2.0, 1.0) == 0.0);
|
||||
/// assert!((2.0f64).clamp(-2.0, 1.0) == 1.0);
|
||||
/// assert!((f64::NAN).clamp(-2.0, 1.0).is_nan());
|
||||
/// ```
|
||||
#[must_use = "method returns a new number and does not mutate the original value"]
|
||||
#[stable(feature = "clamp", since = "1.50.0")]
|
||||
#[inline]
|
||||
pub fn clamp(self, min: f64, max: f64) -> f64 {
|
||||
assert!(min <= max);
|
||||
let mut x = self;
|
||||
if x < min {
|
||||
x = min;
|
||||
}
|
||||
if x > max {
|
||||
x = max;
|
||||
}
|
||||
x
|
||||
}
|
||||
|
||||
// Solaris/Illumos requires a wrapper around log, log2, and log10 functions
|
||||
// because of their non-standard behavior (e.g., log(-n) returns -Inf instead
|
||||
// of expected NaN).
|
||||
|
Loading…
Reference in New Issue
Block a user