diff options
| author | Matthijs Hofstra <thiezz@gmail.com> | 2013-05-29 16:21:29 +0200 |
|---|---|---|
| committer | Matthijs Hofstra <thiezz@gmail.com> | 2013-05-29 18:26:50 +0200 |
| commit | 6cc9a26a2d61acc0b1d707104f8c2a8b7c990012 (patch) | |
| tree | 66ff400df83299f6a92da6285673e7c7f34b9082 /src/libstd/num | |
| parent | e3e55c5c042778b0e50710221d6c0abdfc1119f0 (diff) | |
| download | rust-6cc9a26a2d61acc0b1d707104f8c2a8b7c990012.tar.gz rust-6cc9a26a2d61acc0b1d707104f8c2a8b7c990012.zip | |
Replaced calls to external fmin/fmax by a Rust implementation.
Diffstat (limited to 'src/libstd/num')
| -rw-r--r-- | src/libstd/num/f32.rs | 18 | ||||
| -rw-r--r-- | src/libstd/num/f64.rs | 17 |
2 files changed, 31 insertions, 4 deletions
diff --git a/src/libstd/num/f32.rs b/src/libstd/num/f32.rs index 94cff78375a..0d166c8887c 100644 --- a/src/libstd/num/f32.rs +++ b/src/libstd/num/f32.rs @@ -86,8 +86,6 @@ delegate!( fn erfc(n: c_float) -> c_float = c_float_utils::erfc, fn exp_m1(n: c_float) -> c_float = c_float_utils::exp_m1, fn abs_sub(a: c_float, b: c_float) -> c_float = c_float_utils::abs_sub, - fn fmax(a: c_float, b: c_float) -> c_float = c_float_utils::fmax, - fn fmin(a: c_float, b: c_float) -> c_float = c_float_utils::fmin, fn next_after(x: c_float, y: c_float) -> c_float = c_float_utils::next_after, fn frexp(n: c_float, value: &mut c_int) -> c_float = c_float_utils::frexp, fn hypot(x: c_float, y: c_float) -> c_float = c_float_utils::hypot, @@ -147,6 +145,22 @@ pub fn ge(x: f32, y: f32) -> bool { return x >= y; } #[inline(always)] pub fn gt(x: f32, y: f32) -> bool { return x > y; } +#[inline(always)] +pub fn fmax(x: f32, y: f32) -> f32 { + if x.is_NaN() { y } + else if y.is_NaN() { x } + else if x > y { x } + else { y } +} + +#[inline(always)] +pub fn fmin(x: f32, y: f32) -> f32 { + if x.is_NaN() { y } + else if y.is_NaN() { x } + else if x < y { x } + else { y } +} + // FIXME (#1999): replace the predicates below with llvm intrinsics or // calls to the libmath macros in the rust runtime for performance. diff --git a/src/libstd/num/f64.rs b/src/libstd/num/f64.rs index b7754ed07ad..910e2e1e692 100644 --- a/src/libstd/num/f64.rs +++ b/src/libstd/num/f64.rs @@ -87,8 +87,6 @@ delegate!( fn erfc(n: c_double) -> c_double = c_double_utils::erfc, fn exp_m1(n: c_double) -> c_double = c_double_utils::exp_m1, fn abs_sub(a: c_double, b: c_double) -> c_double = c_double_utils::abs_sub, - fn fmax(a: c_double, b: c_double) -> c_double = c_double_utils::fmax, - fn fmin(a: c_double, b: c_double) -> c_double = c_double_utils::fmin, fn next_after(x: c_double, y: c_double) -> c_double = c_double_utils::next_after, fn frexp(n: c_double, value: &mut c_int) -> c_double = c_double_utils::frexp, fn hypot(x: c_double, y: c_double) -> c_double = c_double_utils::hypot, @@ -172,6 +170,21 @@ pub fn ge(x: f64, y: f64) -> bool { return x >= y; } #[inline(always)] pub fn gt(x: f64, y: f64) -> bool { return x > y; } +#[inline(always)] +pub fn fmax(x: f64, y: f64) -> f64 { + if x.is_NaN() { y } + else if y.is_NaN() { x } + else if x > y { x } + else { y } +} + +#[inline(always)] +pub fn fmin(x: f64, y: f64) -> f64 { + if x.is_NaN() { y } + else if y.is_NaN() { x } + else if x < y { x } + else { y } +} // FIXME (#1999): add is_normal, is_subnormal, and fpclassify |
