Skip to content

Commit 0211833

Browse files
committed
Move FuzzyEq trait into core::cmp and rename it to 'ApproxEq'
1 parent 6e6a4be commit 0211833

File tree

11 files changed

+114
-140
lines changed

11 files changed

+114
-140
lines changed

src/libcore/cmp.rs

+7
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ totaleq_impl!(uint)
6666

6767
totaleq_impl!(char)
6868

69+
/// Trait for testing approximate equality
70+
pub trait ApproxEq<Eps> {
71+
fn approx_epsilon() -> Eps;
72+
fn approx_eq(&self, other: &Self) -> bool;
73+
fn approx_eq_eps(&self, other: &Self, approx_epsilon: &Eps) -> bool;
74+
}
75+
6976
#[deriving(Clone, Eq)]
7077
pub enum Ordering { Less = -1, Equal = 0, Greater = 1 }
7178

src/libcore/num/f32.rs

+25
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,22 @@ impl Eq for f32 {
210210
fn ne(&self, other: &f32) -> bool { (*self) != (*other) }
211211
}
212212

213+
#[cfg(notest)]
214+
impl ApproxEq<f32> for f32 {
215+
#[inline(always)]
216+
fn approx_epsilon() -> f32 { 1.0e-6 }
217+
218+
#[inline(always)]
219+
fn approx_eq(&self, other: &f32) -> bool {
220+
self.approx_eq_eps(other, &ApproxEq::approx_epsilon::<f32, f32>())
221+
}
222+
223+
#[inline(always)]
224+
fn approx_eq_eps(&self, other: &f32, approx_epsilon: &f32) -> bool {
225+
(*self - *other).abs() < *approx_epsilon
226+
}
227+
}
228+
213229
#[cfg(notest)]
214230
impl Ord for f32 {
215231
#[inline(always)]
@@ -974,6 +990,15 @@ mod tests {
974990
assert!(!NaN.is_negative());
975991
}
976992

993+
#[test]
994+
fn test_approx_eq() {
995+
assert!(1.0f32.approx_eq(&1f32));
996+
assert!(0.9999999f32.approx_eq(&1f32));
997+
assert!(1.000001f32.approx_eq_eps(&1f32, &1.0e-5));
998+
assert!(1.0000001f32.approx_eq_eps(&1f32, &1.0e-6));
999+
assert!(!1.0000001f32.approx_eq_eps(&1f32, &1.0e-7));
1000+
}
1001+
9771002
#[test]
9781003
fn test_primitive() {
9791004
assert_eq!(Primitive::bits::<f32>(), sys::size_of::<f32>() * 8);

src/libcore/num/f64.rs

+25
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,22 @@ impl Eq for f64 {
233233
fn ne(&self, other: &f64) -> bool { (*self) != (*other) }
234234
}
235235

236+
#[cfg(notest)]
237+
impl ApproxEq<f64> for f64 {
238+
#[inline(always)]
239+
fn approx_epsilon() -> f64 { 1.0e-6 }
240+
241+
#[inline(always)]
242+
fn approx_eq(&self, other: &f64) -> bool {
243+
self.approx_eq_eps(other, &ApproxEq::approx_epsilon::<f64, f64>())
244+
}
245+
246+
#[inline(always)]
247+
fn approx_eq_eps(&self, other: &f64, approx_epsilon: &f64) -> bool {
248+
(*self - *other).abs() < *approx_epsilon
249+
}
250+
}
251+
236252
#[cfg(notest)]
237253
impl Ord for f64 {
238254
#[inline(always)]
@@ -1022,6 +1038,15 @@ mod tests {
10221038
assert!(!NaN.is_negative());
10231039
}
10241040

1041+
#[test]
1042+
fn test_approx_eq() {
1043+
assert!(1.0f64.approx_eq(&1f64));
1044+
assert!(0.9999999f64.approx_eq(&1f64));
1045+
assert!(1.000001f64.approx_eq_eps(&1f64, &1.0e-5));
1046+
assert!(1.0000001f64.approx_eq_eps(&1f64, &1.0e-6));
1047+
assert!(!1.0000001f64.approx_eq_eps(&1f64, &1.0e-7));
1048+
}
1049+
10251050
#[test]
10261051
fn test_primitive() {
10271052
assert_eq!(Primitive::bits::<f64>(), sys::size_of::<f64>() * 8);

src/libcore/num/float.rs

+25
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,22 @@ impl Eq for float {
371371
fn ne(&self, other: &float) -> bool { (*self) != (*other) }
372372
}
373373
374+
#[cfg(notest)]
375+
impl ApproxEq<float> for float {
376+
#[inline(always)]
377+
fn approx_epsilon() -> float { 1.0e-6 }
378+
379+
#[inline(always)]
380+
fn approx_eq(&self, other: &float) -> bool {
381+
self.approx_eq_eps(other, &ApproxEq::approx_epsilon::<float, float>())
382+
}
383+
384+
#[inline(always)]
385+
fn approx_eq_eps(&self, other: &float, approx_epsilon: &float) -> bool {
386+
(*self - *other).abs() < *approx_epsilon
387+
}
388+
}
389+
374390
#[cfg(notest)]
375391
impl Ord for float {
376392
#[inline(always)]
@@ -985,6 +1001,15 @@ mod tests {
9851001
assert!(!NaN.is_negative());
9861002
}
9871003
1004+
#[test]
1005+
fn test_approx_eq() {
1006+
assert!(1.0f.approx_eq(&1f));
1007+
assert!(0.9999999f.approx_eq(&1f));
1008+
assert!(1.000001f.approx_eq_eps(&1f, &1.0e-5));
1009+
assert!(1.0000001f.approx_eq_eps(&1f, &1.0e-6));
1010+
assert!(!1.0000001f.approx_eq_eps(&1f, &1.0e-7));
1011+
}
1012+
9881013
#[test]
9891014
fn test_primitive() {
9901015
assert_eq!(Primitive::bits::<float>(), sys::size_of::<float>() * 8);

src/libcore/num/num.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
//! An interface for numeric types
12-
use cmp::{Eq, Ord};
12+
use cmp::{Eq, ApproxEq, Ord};
1313
use ops::{Add, Sub, Mul, Div, Rem, Neg};
1414
use ops::{Not, BitAnd, BitOr, BitXor, Shl, Shr};
1515
use option::Option;
@@ -240,7 +240,8 @@ pub trait Int: Integer
240240
///
241241
pub trait Float: Real
242242
+ Signed
243-
+ Primitive {
243+
+ Primitive
244+
+ ApproxEq<Self> {
244245
// FIXME (#5527): These should be associated constants
245246
fn NaN() -> Self;
246247
fn infinity() -> Self;

src/libcore/prelude.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub use io::{print, println};
2828
/* Reexported types and traits */
2929

3030
pub use clone::Clone;
31-
pub use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater, Equiv};
31+
pub use cmp::{Eq, ApproxEq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater, Equiv};
3232
pub use container::{Container, Mutable, Map, Set};
3333
pub use hash::Hash;
3434
pub use old_iter::{BaseIter, ReverseIter, MutableIter, ExtendedIter, EqIter};

src/libstd/cmp.rs

-102
This file was deleted.

src/libstd/std.rc

-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ pub mod term;
8686
pub mod time;
8787
pub mod arena;
8888
pub mod par;
89-
pub mod cmp;
9089
pub mod base64;
9190
pub mod rl;
9291
pub mod workcache;

src/test/run-pass/intrinsics-math.rs

+26-30
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
// option. This file may not be copied, modified, or distributed
1111
// except according to those terms.
1212

13-
extern mod std;
14-
15-
use std::cmp::FuzzyEq;
16-
1713
mod rusti {
1814
#[abi = "rust-intrinsic"]
1915
pub extern "rust-intrinsic" {
@@ -54,44 +50,44 @@ pub fn main() {
5450
unsafe {
5551
use rusti::*;
5652

57-
assert!((sqrtf32(64f32).fuzzy_eq(&8f32)));
58-
assert!((sqrtf64(64f64).fuzzy_eq(&8f64)));
53+
assert!((sqrtf32(64f32).approx_eq(&8f32)));
54+
assert!((sqrtf64(64f64).approx_eq(&8f64)));
5955

60-
assert!((powif32(25f32, -2i32).fuzzy_eq(&0.0016f32)));
61-
assert!((powif64(23.2f64, 2i32).fuzzy_eq(&538.24f64)));
56+
assert!((powif32(25f32, -2i32).approx_eq(&0.0016f32)));
57+
assert!((powif64(23.2f64, 2i32).approx_eq(&538.24f64)));
6258

63-
assert!((sinf32(0f32).fuzzy_eq(&0f32)));
64-
assert!((sinf64(f64::consts::pi / 2f64).fuzzy_eq(&1f64)));
59+
assert!((sinf32(0f32).approx_eq(&0f32)));
60+
assert!((sinf64(f64::consts::pi / 2f64).approx_eq(&1f64)));
6561

66-
assert!((cosf32(0f32).fuzzy_eq(&1f32)));
67-
assert!((cosf64(f64::consts::pi * 2f64).fuzzy_eq(&1f64)));
62+
assert!((cosf32(0f32).approx_eq(&1f32)));
63+
assert!((cosf64(f64::consts::pi * 2f64).approx_eq(&1f64)));
6864

69-
assert!((powf32(25f32, -2f32).fuzzy_eq(&0.0016f32)));
70-
assert!((powf64(400f64, 0.5f64).fuzzy_eq(&20f64)));
65+
assert!((powf32(25f32, -2f32).approx_eq(&0.0016f32)));
66+
assert!((powf64(400f64, 0.5f64).approx_eq(&20f64)));
7167

72-
assert!((fabsf32(expf32(1f32) - f32::consts::e).fuzzy_eq(&0f32)));
73-
assert!((expf64(1f64).fuzzy_eq(&f64::consts::e)));
68+
assert!((fabsf32(expf32(1f32) - f32::consts::e).approx_eq(&0f32)));
69+
assert!((expf64(1f64).approx_eq(&f64::consts::e)));
7470

75-
assert!((exp2f32(10f32).fuzzy_eq(&1024f32)));
76-
assert!((exp2f64(50f64).fuzzy_eq(&1125899906842624f64)));
71+
assert!((exp2f32(10f32).approx_eq(&1024f32)));
72+
assert!((exp2f64(50f64).approx_eq(&1125899906842624f64)));
7773

78-
assert!((fabsf32(logf32(f32::consts::e) - 1f32).fuzzy_eq(&0f32)));
79-
assert!((logf64(1f64).fuzzy_eq(&0f64)));
74+
assert!((fabsf32(logf32(f32::consts::e) - 1f32).approx_eq(&0f32)));
75+
assert!((logf64(1f64).approx_eq(&0f64)));
8076

81-
assert!((log10f32(10f32).fuzzy_eq(&1f32)));
82-
assert!((log10f64(f64::consts::e).fuzzy_eq(&f64::consts::log10_e)));
77+
assert!((log10f32(10f32).approx_eq(&1f32)));
78+
assert!((log10f64(f64::consts::e).approx_eq(&f64::consts::log10_e)));
8379

84-
assert!((log2f32(8f32).fuzzy_eq(&3f32)));
85-
assert!((log2f64(f64::consts::e).fuzzy_eq(&f64::consts::log2_e)));
80+
assert!((log2f32(8f32).approx_eq(&3f32)));
81+
assert!((log2f64(f64::consts::e).approx_eq(&f64::consts::log2_e)));
8682

87-
assert!((fmaf32(1.0f32, 2.0f32, 5.0f32).fuzzy_eq(&7.0f32)));
88-
assert!((fmaf64(0.0f64, -2.0f64, f64::consts::e).fuzzy_eq(&f64::consts::e)));
83+
assert!((fmaf32(1.0f32, 2.0f32, 5.0f32).approx_eq(&7.0f32)));
84+
assert!((fmaf64(0.0f64, -2.0f64, f64::consts::e).approx_eq(&f64::consts::e)));
8985

90-
assert!((fabsf32(-1.0f32).fuzzy_eq(&1.0f32)));
91-
assert!((fabsf64(34.2f64).fuzzy_eq(&34.2f64)));
86+
assert!((fabsf32(-1.0f32).approx_eq(&1.0f32)));
87+
assert!((fabsf64(34.2f64).approx_eq(&34.2f64)));
9288

93-
assert!((floorf32(3.8f32).fuzzy_eq(&3.0f32)));
94-
assert!((floorf64(-1.1f64).fuzzy_eq(&-2.0f64)));
89+
assert!((floorf32(3.8f32).approx_eq(&3.0f32)));
90+
assert!((floorf64(-1.1f64).approx_eq(&-2.0f64)));
9591

9692
// Causes linker error
9793
// undefined reference to llvm.ceil.f32/64

src/test/run-pass/trait-inheritance-num.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@ extern mod std;
1414

1515
use core::cmp::{Eq, Ord};
1616
use core::num::NumCast::from;
17-
use std::cmp::FuzzyEq;
1817

1918
pub trait NumExt: Num + NumCast + Eq + Ord {}
2019

21-
pub trait FloatExt: NumExt + FuzzyEq<Self> {}
20+
pub trait FloatExt: NumExt + ApproxEq<Self> {}
2221

2322
fn greater_than_one<T:NumExt>(n: &T) -> bool { *n > from(1) }
2423
fn greater_than_one_float<T:FloatExt>(n: &T) -> bool { *n > from(1) }

src/test/run-pass/trait-inheritance-num2.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ extern mod std;
1616

1717
use core::cmp::{Eq, Ord};
1818
use core::num::NumCast::from;
19-
use std::cmp::FuzzyEq;
2019

2120
pub trait TypeExt {}
2221

@@ -94,7 +93,7 @@ impl IntegerExt for i64 {}
9493
impl IntegerExt for int {}
9594

9695

97-
pub trait FloatExt: NumExt + FuzzyEq<Self> {}
96+
pub trait FloatExt: NumExt + ApproxEq<Self> {}
9897

9998
impl FloatExt for f32 {}
10099
impl FloatExt for f64 {}

0 commit comments

Comments
 (0)