@@ -289,79 +289,79 @@ fn test_is_sign_negative() {
289
289
assert ! ( ( -f64 :: NAN ) . is_sign_negative( ) ) ;
290
290
}
291
291
292
+ macro_rules! assert_f64_biteq {
293
+ ( $left : expr, $right : expr) => {
294
+ let l: & f64 = & $left;
295
+ let r: & f64 = & $right;
296
+ let lb = l. to_bits( ) ;
297
+ let rb = r. to_bits( ) ;
298
+ assert_eq!( lb, rb, "float {} ({:#x}) is not equal to {} ({:#x})" , * l, lb, * r, rb) ;
299
+ }
300
+ }
301
+
302
+ // Ignore test on x87 floating point, these platforms do not guarantee NaN
303
+ // payloads are preserved and flush denormals to zero, failing the tests.
304
+ #[ cfg( not( target_arch = "x86" ) ) ]
292
305
#[ test]
293
306
fn test_next_up ( ) {
294
307
let tiny = f64:: from_bits ( 1 ) ;
295
308
let tiny_up = f64:: from_bits ( 2 ) ;
296
309
let max_down = f64:: from_bits ( 0x7fef_ffff_ffff_fffe ) ;
297
310
let largest_subnormal = f64:: from_bits ( 0x000f_ffff_ffff_ffff ) ;
298
311
let smallest_normal = f64:: from_bits ( 0x0010_0000_0000_0000 ) ;
299
-
300
- // Check that NaNs roundtrip.
301
- // Ignore test on x87 floating point, the code is still correct but these
302
- // platforms do not guarantee NaN payloads are preserved, which caused these
303
- // tests to fail.
304
- #[ cfg( not( all( target_arch = "x86" , not( target_feature = "fxsr" ) ) ) ) ]
305
- {
306
- let nan0 = f64:: NAN ;
307
- let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
308
- let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
309
- assert_eq ! ( nan0. next_up( ) . to_bits( ) , nan0. to_bits( ) ) ;
310
- assert_eq ! ( nan1. next_up( ) . to_bits( ) , nan1. to_bits( ) ) ;
311
- assert_eq ! ( nan2. next_up( ) . to_bits( ) , nan2. to_bits( ) ) ;
312
- }
313
-
314
- assert_eq ! ( f64 :: NEG_INFINITY . next_up( ) , f64 :: MIN ) ;
315
- assert_eq ! ( f64 :: MIN . next_up( ) , -max_down) ;
316
- assert_eq ! ( ( -1.0 - f64 :: EPSILON ) . next_up( ) , -1.0 ) ;
317
- assert_eq ! ( ( -smallest_normal) . next_up( ) , -largest_subnormal) ;
318
- assert_eq ! ( ( -tiny_up) . next_up( ) , -tiny) ;
319
- assert_eq ! ( ( -tiny) . next_up( ) . to_bits( ) , ( -0.0f64 ) . to_bits( ) ) ;
320
- assert_eq ! ( ( -0.0f64 ) . next_up( ) , tiny) ;
321
- assert_eq ! ( 0.0f64 . next_up( ) , tiny) ;
322
- assert_eq ! ( tiny. next_up( ) , tiny_up) ;
323
- assert_eq ! ( largest_subnormal. next_up( ) , smallest_normal) ;
324
- assert_eq ! ( 1.0f64 . next_up( ) , 1.0 + f64 :: EPSILON ) ;
325
- assert_eq ! ( f64 :: MAX . next_up( ) , f64 :: INFINITY ) ;
326
- assert_eq ! ( f64 :: INFINITY . next_up( ) , f64 :: INFINITY ) ;
327
- }
328
-
312
+ assert_f64_biteq ! ( f64 :: NEG_INFINITY . next_up( ) , f64 :: MIN ) ;
313
+ assert_f64_biteq ! ( f64 :: MIN . next_up( ) , -max_down) ;
314
+ assert_f64_biteq ! ( ( -1.0 - f64 :: EPSILON ) . next_up( ) , -1.0 ) ;
315
+ assert_f64_biteq ! ( ( -smallest_normal) . next_up( ) , -largest_subnormal) ;
316
+ assert_f64_biteq ! ( ( -tiny_up) . next_up( ) , -tiny) ;
317
+ assert_f64_biteq ! ( ( -tiny) . next_up( ) , -0.0f64 ) ;
318
+ assert_f64_biteq ! ( ( -0.0f64 ) . next_up( ) , tiny) ;
319
+ assert_f64_biteq ! ( 0.0f64 . next_up( ) , tiny) ;
320
+ assert_f64_biteq ! ( tiny. next_up( ) , tiny_up) ;
321
+ assert_f64_biteq ! ( largest_subnormal. next_up( ) , smallest_normal) ;
322
+ assert_f64_biteq ! ( 1.0f64 . next_up( ) , 1.0 + f64 :: EPSILON ) ;
323
+ assert_f64_biteq ! ( f64 :: MAX . next_up( ) , f64 :: INFINITY ) ;
324
+ assert_f64_biteq ! ( f64 :: INFINITY . next_up( ) , f64 :: INFINITY ) ;
325
+
326
+ let nan0 = f64:: NAN ;
327
+ let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
328
+ let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
329
+ assert_f64_biteq ! ( nan0. next_up( ) , nan0) ;
330
+ assert_f64_biteq ! ( nan1. next_up( ) , nan1) ;
331
+ assert_f64_biteq ! ( nan2. next_up( ) , nan2) ;
332
+ }
333
+
334
+ // Ignore test on x87 floating point, these platforms do not guarantee NaN
335
+ // payloads are preserved and flush denormals to zero, failing the tests.
336
+ #[ cfg( not( target_arch = "x86" ) ) ]
329
337
#[ test]
330
338
fn test_next_down ( ) {
331
339
let tiny = f64:: from_bits ( 1 ) ;
332
340
let tiny_up = f64:: from_bits ( 2 ) ;
333
341
let max_down = f64:: from_bits ( 0x7fef_ffff_ffff_fffe ) ;
334
342
let largest_subnormal = f64:: from_bits ( 0x000f_ffff_ffff_ffff ) ;
335
343
let smallest_normal = f64:: from_bits ( 0x0010_0000_0000_0000 ) ;
336
-
337
- // Check that NaNs roundtrip.
338
- // Ignore test on x87 floating point, the code is still correct but these
339
- // platforms do not guarantee NaN payloads are preserved, which caused these
340
- // tests to fail.
341
- #[ cfg( not( all( target_arch = "x86" , not( target_feature = "fxsr" ) ) ) ) ]
342
- {
343
- let nan0 = f64:: NAN ;
344
- let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
345
- let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
346
- assert_eq ! ( nan0. next_down( ) . to_bits( ) , nan0. to_bits( ) ) ;
347
- assert_eq ! ( nan1. next_down( ) . to_bits( ) , nan1. to_bits( ) ) ;
348
- assert_eq ! ( nan2. next_down( ) . to_bits( ) , nan2. to_bits( ) ) ;
349
- }
350
-
351
- assert_eq ! ( f64 :: NEG_INFINITY . next_down( ) , f64 :: NEG_INFINITY ) ;
352
- assert_eq ! ( f64 :: MIN . next_down( ) , f64 :: NEG_INFINITY ) ;
353
- assert_eq ! ( ( -max_down) . next_down( ) , f64 :: MIN ) ;
354
- assert_eq ! ( ( -1.0f64 ) . next_down( ) , -1.0 - f64 :: EPSILON ) ;
355
- assert_eq ! ( ( -largest_subnormal) . next_down( ) , -smallest_normal) ;
356
- assert_eq ! ( ( -tiny) . next_down( ) , -tiny_up) ;
357
- assert_eq ! ( ( -0.0f64 ) . next_down( ) , -tiny) ;
358
- assert_eq ! ( ( 0.0f64 ) . next_down( ) , -tiny) ;
359
- assert_eq ! ( tiny. next_down( ) . to_bits( ) , 0.0f64 . to_bits( ) ) ;
360
- assert_eq ! ( tiny_up. next_down( ) , tiny) ;
361
- assert_eq ! ( smallest_normal. next_down( ) , largest_subnormal) ;
362
- assert_eq ! ( ( 1.0 + f64 :: EPSILON ) . next_down( ) , 1.0f64 ) ;
363
- assert_eq ! ( f64 :: MAX . next_down( ) , max_down) ;
364
- assert_eq ! ( f64 :: INFINITY . next_down( ) , f64 :: MAX ) ;
344
+ assert_f64_biteq ! ( f64 :: NEG_INFINITY . next_down( ) , f64 :: NEG_INFINITY ) ;
345
+ assert_f64_biteq ! ( f64 :: MIN . next_down( ) , f64 :: NEG_INFINITY ) ;
346
+ assert_f64_biteq ! ( ( -max_down) . next_down( ) , f64 :: MIN ) ;
347
+ assert_f64_biteq ! ( ( -1.0f64 ) . next_down( ) , -1.0 - f64 :: EPSILON ) ;
348
+ assert_f64_biteq ! ( ( -largest_subnormal) . next_down( ) , -smallest_normal) ;
349
+ assert_f64_biteq ! ( ( -tiny) . next_down( ) , -tiny_up) ;
350
+ assert_f64_biteq ! ( ( -0.0f64 ) . next_down( ) , -tiny) ;
351
+ assert_f64_biteq ! ( ( 0.0f64 ) . next_down( ) , -tiny) ;
352
+ assert_f64_biteq ! ( tiny. next_down( ) , 0.0f64 ) ;
353
+ assert_f64_biteq ! ( tiny_up. next_down( ) , tiny) ;
354
+ assert_f64_biteq ! ( smallest_normal. next_down( ) , largest_subnormal) ;
355
+ assert_f64_biteq ! ( ( 1.0 + f64 :: EPSILON ) . next_down( ) , 1.0f64 ) ;
356
+ assert_f64_biteq ! ( f64 :: MAX . next_down( ) , max_down) ;
357
+ assert_f64_biteq ! ( f64 :: INFINITY . next_down( ) , f64 :: MAX ) ;
358
+
359
+ let nan0 = f64:: NAN ;
360
+ let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
361
+ let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
362
+ assert_f64_biteq ! ( nan0. next_down( ) , nan0) ;
363
+ assert_f64_biteq ! ( nan1. next_down( ) , nan1) ;
364
+ assert_f64_biteq ! ( nan2. next_down( ) , nan2) ;
365
365
}
366
366
367
367
#[ test]
0 commit comments