@@ -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