@@ -14,36 +14,36 @@ use core::f32;
14
14
use core:: f64;
15
15
use core:: float;
16
16
17
- const fuzzy_epsilon : float = 1.0e-6 ;
17
+ pub const FUZZY_EPSILON : float = 1.0e-6 ;
18
18
19
- pub trait FuzzyEq {
19
+ pub trait FuzzyEq < Eps > {
20
20
pure fn fuzzy_eq ( & self , other : & Self ) -> bool ;
21
- pure fn fuzzy_eq_eps ( & self , other : & Self , epsilon : & Self ) -> bool ;
21
+ pure fn fuzzy_eq_eps ( & self , other : & Self , epsilon : & Eps ) -> bool ;
22
22
}
23
23
24
- impl float: FuzzyEq {
24
+ impl float: FuzzyEq < float > {
25
25
pure fn fuzzy_eq ( & self , other : & float ) -> bool {
26
- self . fuzzy_eq_eps ( other, & fuzzy_epsilon )
26
+ self . fuzzy_eq_eps ( other, & FUZZY_EPSILON )
27
27
}
28
28
29
29
pure fn fuzzy_eq_eps ( & self , other : & float , epsilon : & float ) -> bool {
30
30
float:: abs ( * self - * other) < * epsilon
31
31
}
32
32
}
33
33
34
- impl f32 : FuzzyEq {
34
+ impl f32 : FuzzyEq < f32 > {
35
35
pure fn fuzzy_eq ( & self , other : & f32 ) -> bool {
36
- self . fuzzy_eq_eps ( other, & ( fuzzy_epsilon as f32 ) )
36
+ self . fuzzy_eq_eps ( other, & ( FUZZY_EPSILON as f32 ) )
37
37
}
38
38
39
39
pure fn fuzzy_eq_eps ( & self , other : & f32 , epsilon : & f32 ) -> bool {
40
40
f32:: abs ( * self - * other) < * epsilon
41
41
}
42
42
}
43
43
44
- impl f64 : FuzzyEq {
44
+ impl f64 : FuzzyEq < f64 > {
45
45
pure fn fuzzy_eq ( & self , other : & f64 ) -> bool {
46
- self . fuzzy_eq_eps ( other, & ( fuzzy_epsilon as f64 ) )
46
+ self . fuzzy_eq_eps ( other, & ( FUZZY_EPSILON as f64 ) )
47
47
}
48
48
49
49
pure fn fuzzy_eq_eps ( & self , other : & f64 , epsilon : & f64 ) -> bool {
@@ -63,3 +63,40 @@ fn test_fuzzy_eq_eps() {
63
63
assert ( & 1.2 f) . fuzzy_eq_eps ( & 0.9 , & 0.5 ) ;
64
64
assert ! ( & 1.5 f) . fuzzy_eq_eps ( & 0.9 , & 0.5 ) ;
65
65
}
66
+
67
+ #[ test]
68
+ mod test_complex{
69
+ use cmp:: * ;
70
+
71
+ struct Complex { r : float , i : float }
72
+
73
+ impl Complex : FuzzyEq < float > {
74
+ pure fn fuzzy_eq ( & self , other : & Complex ) -> bool {
75
+ self . fuzzy_eq_eps ( other, & FUZZY_EPSILON )
76
+ }
77
+
78
+ pure fn fuzzy_eq_eps ( & self , other : & Complex ,
79
+ epsilon : & float ) -> bool {
80
+ self . r . fuzzy_eq_eps ( & other. r , epsilon) &&
81
+ self . i . fuzzy_eq_eps ( & other. i , epsilon)
82
+ }
83
+ }
84
+
85
+ #[ test]
86
+ fn test_fuzzy_equals ( ) {
87
+ let a = Complex { r : 0.9 , i : 0.9 } ;
88
+ let b = Complex { r : 0.9 , i : 0.9 } ;
89
+
90
+ assert ( a. fuzzy_eq ( & b) ) ;
91
+ }
92
+
93
+ #[ test]
94
+ fn test_fuzzy_eq_eps ( ) {
95
+ let other = Complex { r : 0.9 , i : 0.9 } ;
96
+
97
+ assert ( & Complex { r : 0.9 , i : 1.2 } ) . fuzzy_eq_eps ( & other, & 0.5 ) ;
98
+ assert ( & Complex { r : 1.2 , i : 0.9 } ) . fuzzy_eq_eps ( & other, & 0.5 ) ;
99
+ assert ! ( & Complex { r: 0.9 , i: 1.5 } ) . fuzzy_eq_eps ( & other, & 0.5 ) ;
100
+ assert ! ( & Complex { r: 1.5 , i: 0.9 } ) . fuzzy_eq_eps ( & other, & 0.5 ) ;
101
+ }
102
+ }
0 commit comments