@@ -289,79 +289,79 @@ fn test_is_sign_negative() {
289289 assert ! ( ( -f64 :: NAN ) . is_sign_negative( ) ) ;
290290}
291291
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" ) ) ]
292305#[ test]
293306fn test_next_up ( ) {
294307 let tiny = f64:: from_bits ( 1 ) ;
295308 let tiny_up = f64:: from_bits ( 2 ) ;
296309 let max_down = f64:: from_bits ( 0x7fef_ffff_ffff_fffe ) ;
297310 let largest_subnormal = f64:: from_bits ( 0x000f_ffff_ffff_ffff ) ;
298311 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" ) ) ]
329337#[ test]
330338fn test_next_down ( ) {
331339 let tiny = f64:: from_bits ( 1 ) ;
332340 let tiny_up = f64:: from_bits ( 2 ) ;
333341 let max_down = f64:: from_bits ( 0x7fef_ffff_ffff_fffe ) ;
334342 let largest_subnormal = f64:: from_bits ( 0x000f_ffff_ffff_ffff ) ;
335343 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) ;
365365}
366366
367367#[ test]
0 commit comments