-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add clamp functions #44097
Add clamp functions #44097
Changes from 5 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1080,6 +1080,32 @@ impl f32 { | |
0.5 * ((2.0 * self) / (1.0 - self)).ln_1p() | ||
} | ||
|
||
/// Returns max if self is greater than max, and min if self is less than min. | ||
/// Otherwise this returns self. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// #![feature(clamp)] | ||
/// use std::f32::NAN; | ||
/// assert!((-3.0f32).clamp(-2.0f32, 1.0f32) == -2.0f32); | ||
/// assert!((0.0f32).clamp(-2.0f32, 1.0f32) == 0.0f32); | ||
/// assert!((2.0f32).clamp(-2.0f32, 1.0f32) == 1.0f32); | ||
/// assert!((NAN).clamp(-2.0f32, 1.0f32).is_nan()); | ||
/// ``` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps an example of NAN input giving NAN output? |
||
/// | ||
/// # Panics | ||
/// Panics if min > max, min is NaN, or max is NaN. | ||
#[unstable(feature = "clamp", issue = "44095")] | ||
#[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 | ||
} | ||
|
||
/// Raw transmutation to `u32`. | ||
/// | ||
/// Converts the `f32` into its raw memory representation, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -970,6 +970,32 @@ impl f64 { | |
0.5 * ((2.0 * self) / (1.0 - self)).ln_1p() | ||
} | ||
|
||
/// Returns max if self is greater than max, and min if self is less than min. | ||
/// Otherwise this returns self. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
/// #![feature(clamp)] | ||
/// use std::f64::NAN; | ||
/// assert!((-3.0f64).clamp(-2.0f64, 1.0f64) == -2.0f64); | ||
/// assert!((0.0f64).clamp(-2.0f64, 1.0f64) == 0.0f64); | ||
/// assert!((2.0f64).clamp(-2.0f64, 1.0f64) == 1.0f64); | ||
/// assert!((NAN).clamp(-2.0f64, 1.0f64).is_nan()); | ||
/// ``` | ||
/// | ||
/// # Panics | ||
/// Panics if min > max, min is NaN, or max is NaN. | ||
#[unstable(feature = "clamp", issue = "44095")] | ||
#[inline] | ||
pub fn clamp(self, min: f64, max: f64) -> f64 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm a Rust beginner, but I think, this should also work. I don't like the if x < min { min }
if x > max { max }
else { self } There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That was the original implementation. This specific code pattern was chosen because it yields a highly efficient assembly implementation. This was actually the source of quite a bit of conversation before we settled on this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, interesting and There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, and that. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Holy caroly (this is actually no real word, but it rhymes)! |
||
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). | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you format this in a way that is consistent with the surrounding code? (Do we do rustmt on this stuff yet?)