Skip to content

Commit 2b9646e

Browse files
committed
Use MIN_POSITIVE as default relative epsilon
1 parent 85342ce commit 2b9646e

File tree

2 files changed

+63
-77
lines changed

2 files changed

+63
-77
lines changed

approx/src/relative_eq.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ macro_rules! impl_relative_eq {
7575
impl RelativeEq for $T {
7676
#[inline]
7777
fn default_relative_epsilon() -> $T {
78-
$T::EPSILON
78+
$T::MIN_POSITIVE
7979
}
8080

8181
#[inline]

approx/tests/relative_eq.rs

Lines changed: 62 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -42,52 +42,44 @@ mod test_f32 {
4242
assert_relative_ne!(1.0f32, 1.0f32);
4343
}
4444

45+
fn compare_near_numbers(number: f32) {
46+
let rel_eq_number = number * 1.0000001f32;
47+
assert_ne!(number, rel_eq_number);
48+
assert_relative_eq!(number, rel_eq_number);
49+
assert_relative_eq!(rel_eq_number, number);
50+
let rel_ne_number = number * 1.0000002f32;
51+
assert_relative_ne!(number, rel_ne_number);
52+
assert_relative_ne!(rel_ne_number, number);
53+
}
54+
4555
#[test]
4656
fn test_big() {
47-
assert_relative_eq!(100000000.0f32, 100000001.0f32);
48-
assert_relative_eq!(100000001.0f32, 100000000.0f32);
49-
assert_relative_ne!(10000.0f32, 10001.0f32);
50-
assert_relative_ne!(10001.0f32, 10000.0f32);
57+
compare_near_numbers(1e20f32);
5158
}
5259

5360
#[test]
5461
fn test_big_neg() {
55-
assert_relative_eq!(-100000000.0f32, -100000001.0f32);
56-
assert_relative_eq!(-100000001.0f32, -100000000.0f32);
57-
assert_relative_ne!(-10000.0f32, -10001.0f32);
58-
assert_relative_ne!(-10001.0f32, -10000.0f32);
62+
compare_near_numbers(-1e20f32);
5963
}
6064

6165
#[test]
6266
fn test_mid() {
63-
assert_relative_eq!(1.0000001f32, 1.0000002f32);
64-
assert_relative_eq!(1.0000002f32, 1.0000001f32);
65-
assert_relative_ne!(1.000001f32, 1.000002f32);
66-
assert_relative_ne!(1.000002f32, 1.000001f32);
67+
compare_near_numbers(1f32);
6768
}
6869

6970
#[test]
7071
fn test_mid_neg() {
71-
assert_relative_eq!(-1.0000001f32, -1.0000002f32);
72-
assert_relative_eq!(-1.0000002f32, -1.0000001f32);
73-
assert_relative_ne!(-1.000001f32, -1.000002f32);
74-
assert_relative_ne!(-1.000002f32, -1.000001f32);
72+
compare_near_numbers(-1f32);
7573
}
7674

7775
#[test]
7876
fn test_small() {
79-
assert_relative_eq!(0.000010001f32, 0.000010002f32);
80-
assert_relative_eq!(0.000010002f32, 0.000010001f32);
81-
assert_relative_ne!(0.000001002f32, 0.0000001001f32);
82-
assert_relative_ne!(0.000001001f32, 0.0000001002f32);
77+
compare_near_numbers(1e-20f32);
8378
}
8479

8580
#[test]
8681
fn test_small_neg() {
87-
assert_relative_eq!(-0.000010001f32, -0.000010002f32);
88-
assert_relative_eq!(-0.000010002f32, -0.000010001f32);
89-
assert_relative_ne!(-0.000001002f32, -0.0000001001f32);
90-
assert_relative_ne!(-0.000001001f32, -0.0000001002f32);
82+
compare_near_numbers(-1e-20f32);
9183
}
9284

9385
#[test]
@@ -104,15 +96,15 @@ mod test_f32 {
10496

10597
#[test]
10698
fn test_epsilon() {
107-
assert_relative_eq!(0.0f32, 1e-40f32, epsilon = 1e-40f32);
108-
assert_relative_eq!(1e-40f32, 0.0f32, epsilon = 1e-40f32);
109-
assert_relative_eq!(0.0f32, -1e-40f32, epsilon = 1e-40f32);
110-
assert_relative_eq!(-1e-40f32, 0.0f32, epsilon = 1e-40f32);
99+
assert_relative_eq!(0.0f32, 1e-20f32, epsilon = 1e-20f32);
100+
assert_relative_eq!(1e-20f32, 0.0f32, epsilon = 1e-20f32);
101+
assert_relative_eq!(0.0f32, -1e-20f32, epsilon = 1e-20f32);
102+
assert_relative_eq!(-1e-20f32, 0.0f32, epsilon = 1e-20f32);
111103

112-
assert_relative_ne!(1e-40f32, 0.0f32, epsilon = 1e-41f32);
113-
assert_relative_ne!(0.0f32, 1e-40f32, epsilon = 1e-41f32);
114-
assert_relative_ne!(-1e-40f32, 0.0f32, epsilon = 1e-41f32);
115-
assert_relative_ne!(0.0f32, -1e-40f32, epsilon = 1e-41f32);
104+
assert_relative_ne!(1e-20f32, 0.0f32, epsilon = 1e-21f32);
105+
assert_relative_ne!(0.0f32, 1e-20f32, epsilon = 1e-21f32);
106+
assert_relative_ne!(-1e-20f32, 0.0f32, epsilon = 1e-21f32);
107+
assert_relative_ne!(0.0f32, -1e-20f32, epsilon = 1e-21f32);
116108
}
117109

118110
#[test]
@@ -169,25 +161,23 @@ mod test_f32 {
169161
assert_relative_ne!(-1.0f32, 1.000000001f32);
170162
assert_relative_ne!(-1.000000001f32, 1.0f32);
171163
assert_relative_ne!(1.0f32, -1.000000001f32);
172-
173-
assert_relative_eq!(10.0 * f32::MIN_POSITIVE, 10.0 * -f32::MIN_POSITIVE);
174164
}
175165

176166
#[test]
177167
fn test_close_to_zero() {
178168
assert_relative_eq!(f32::MIN_POSITIVE, f32::MIN_POSITIVE);
179-
assert_relative_eq!(f32::MIN_POSITIVE, -f32::MIN_POSITIVE);
180-
assert_relative_eq!(-f32::MIN_POSITIVE, f32::MIN_POSITIVE);
169+
assert_relative_eq!(f32::MIN_POSITIVE / 2.0f32, -f32::MIN_POSITIVE / 2.0f32);
170+
assert_relative_eq!(-f32::MIN_POSITIVE / 2.0f32, f32::MIN_POSITIVE / 2.0f32);
181171

182172
assert_relative_eq!(f32::MIN_POSITIVE, 0.0f32);
183173
assert_relative_eq!(0.0f32, f32::MIN_POSITIVE);
184174
assert_relative_eq!(-f32::MIN_POSITIVE, 0.0f32);
185175
assert_relative_eq!(0.0f32, -f32::MIN_POSITIVE);
186176

187-
assert_relative_ne!(0.000001f32, -f32::MIN_POSITIVE);
188-
assert_relative_ne!(0.000001f32, f32::MIN_POSITIVE);
189-
assert_relative_ne!(f32::MIN_POSITIVE, 0.000001f32);
190-
assert_relative_ne!(-f32::MIN_POSITIVE, 0.000001f32);
177+
assert_relative_ne!(1e-20f32, -f32::MIN_POSITIVE);
178+
assert_relative_ne!(1e-20f32, f32::MIN_POSITIVE);
179+
assert_relative_ne!(f32::MIN_POSITIVE, 1e-20f32);
180+
assert_relative_ne!(-f32::MIN_POSITIVE, 1e-20f32);
191181
}
192182

193183
#[test]
@@ -226,52 +216,44 @@ mod test_f64 {
226216
assert_relative_ne!(1.0f64, 1.0f64);
227217
}
228218

219+
fn compare_near_numbers(number: f64) {
220+
let rel_eq_number = number * 1.0000000000000002f64;
221+
assert_ne!(number, rel_eq_number);
222+
assert_relative_eq!(number, rel_eq_number);
223+
assert_relative_eq!(rel_eq_number, number);
224+
let rel_ne_number = number * 1.0000000000000004f64;
225+
assert_relative_ne!(number, rel_ne_number);
226+
assert_relative_ne!(rel_ne_number, number);
227+
}
228+
229229
#[test]
230230
fn test_big() {
231-
assert_relative_eq!(10000000000000000.0f64, 10000000000000001.0f64);
232-
assert_relative_eq!(10000000000000001.0f64, 10000000000000000.0f64);
233-
assert_relative_ne!(1000000000000000.0f64, 1000000000000001.0f64);
234-
assert_relative_ne!(1000000000000001.0f64, 1000000000000000.0f64);
231+
compare_near_numbers(1e250f64);
235232
}
236233

237234
#[test]
238235
fn test_big_neg() {
239-
assert_relative_eq!(-10000000000000000.0f64, -10000000000000001.0f64);
240-
assert_relative_eq!(-10000000000000001.0f64, -10000000000000000.0f64);
241-
assert_relative_ne!(-1000000000000000.0f64, -1000000000000001.0f64);
242-
assert_relative_ne!(-1000000000000001.0f64, -1000000000000000.0f64);
236+
compare_near_numbers(-1e250f64);
243237
}
244238

245239
#[test]
246240
fn test_mid() {
247-
assert_relative_eq!(1.0000000000000001f64, 1.0000000000000002f64);
248-
assert_relative_eq!(1.0000000000000002f64, 1.0000000000000001f64);
249-
assert_relative_ne!(1.000000000000001f64, 1.000000000000002f64);
250-
assert_relative_ne!(1.000000000000002f64, 1.000000000000001f64);
241+
compare_near_numbers(1f64);
251242
}
252243

253244
#[test]
254245
fn test_mid_neg() {
255-
assert_relative_eq!(-1.0000000000000001f64, -1.0000000000000002f64);
256-
assert_relative_eq!(-1.0000000000000002f64, -1.0000000000000001f64);
257-
assert_relative_ne!(-1.000000000000001f64, -1.000000000000002f64);
258-
assert_relative_ne!(-1.000000000000002f64, -1.000000000000001f64);
246+
compare_near_numbers(-1f64);
259247
}
260248

261249
#[test]
262250
fn test_small() {
263-
assert_relative_eq!(0.0000000100000001f64, 0.0000000100000002f64);
264-
assert_relative_eq!(0.0000000100000002f64, 0.0000000100000001f64);
265-
assert_relative_ne!(0.0000000100000001f64, 0.0000000010000002f64);
266-
assert_relative_ne!(0.0000000100000002f64, 0.0000000010000001f64);
251+
compare_near_numbers(1e-250f64);
267252
}
268253

269254
#[test]
270255
fn test_small_neg() {
271-
assert_relative_eq!(-0.0000000100000001f64, -0.0000000100000002f64);
272-
assert_relative_eq!(-0.0000000100000002f64, -0.0000000100000001f64);
273-
assert_relative_ne!(-0.0000000100000001f64, -0.0000000010000002f64);
274-
assert_relative_ne!(-0.0000000100000002f64, -0.0000000010000001f64);
256+
compare_near_numbers(-1e-250f64);
275257
}
276258

277259
#[test]
@@ -337,6 +319,12 @@ mod test_f64 {
337319
assert_relative_ne!(f64::NEG_INFINITY, f64::INFINITY);
338320
}
339321

322+
#[test]
323+
fn test_zero_infinity() {
324+
assert_relative_ne!(0f64, f64::INFINITY);
325+
assert_relative_ne!(0f64, f64::NEG_INFINITY);
326+
}
327+
340328
#[test]
341329
fn test_nan() {
342330
assert_relative_ne!(f64::NAN, f64::NAN);
@@ -364,29 +352,27 @@ mod test_f64 {
364352

365353
#[test]
366354
fn test_opposite_signs() {
367-
assert_relative_ne!(1.000000001f64, -1.0f64);
368-
assert_relative_ne!(-1.0f64, 1.000000001f64);
369-
assert_relative_ne!(-1.000000001f64, 1.0f64);
370-
assert_relative_ne!(1.0f64, -1.000000001f64);
371-
372-
assert_relative_eq!(10.0 * f64::MIN_POSITIVE, 10.0 * -f64::MIN_POSITIVE);
355+
assert_relative_ne!(1.0000000000000002f64, -1.0f64);
356+
assert_relative_ne!(-1.0f64, 1.0000000000000002f64);
357+
assert_relative_ne!(-1.0000000000000002f64, 1.0f64);
358+
assert_relative_ne!(1.0f64, -1.0000000000000002f64);
373359
}
374360

375361
#[test]
376362
fn test_close_to_zero() {
377363
assert_relative_eq!(f64::MIN_POSITIVE, f64::MIN_POSITIVE);
378-
assert_relative_eq!(f64::MIN_POSITIVE, -f64::MIN_POSITIVE);
379-
assert_relative_eq!(-f64::MIN_POSITIVE, f64::MIN_POSITIVE);
364+
assert_relative_eq!(f64::MIN_POSITIVE / 2.0f64, -f64::MIN_POSITIVE / 2.0f64);
365+
assert_relative_eq!(-f64::MIN_POSITIVE / 2.0f64, f64::MIN_POSITIVE / 2.0f64);
380366

381367
assert_relative_eq!(f64::MIN_POSITIVE, 0.0f64);
382368
assert_relative_eq!(0.0f64, f64::MIN_POSITIVE);
383369
assert_relative_eq!(-f64::MIN_POSITIVE, 0.0f64);
384370
assert_relative_eq!(0.0f64, -f64::MIN_POSITIVE);
385371

386-
assert_relative_ne!(0.000000000000001f64, -f64::MIN_POSITIVE);
387-
assert_relative_ne!(0.000000000000001f64, f64::MIN_POSITIVE);
388-
assert_relative_ne!(f64::MIN_POSITIVE, 0.000000000000001f64);
389-
assert_relative_ne!(-f64::MIN_POSITIVE, 0.000000000000001f64);
372+
assert_relative_ne!(1e-250f64, -f64::MIN_POSITIVE);
373+
assert_relative_ne!(1e-250f64, f64::MIN_POSITIVE);
374+
assert_relative_ne!(f64::MIN_POSITIVE, 1e-250f64);
375+
assert_relative_ne!(-f64::MIN_POSITIVE, 1e-250f64);
390376
}
391377

392378
#[test]

0 commit comments

Comments
 (0)