@@ -299,6 +299,84 @@ fn test_is_sign_negative() {
299299 assert ! ( ( -f32 :: NAN ) . is_sign_negative( ) ) ;
300300}
301301
302+ #[ allow( unused_macros) ]
303+ macro_rules! assert_f32_biteq {
304+ ( $left : expr, $right : expr) => {
305+ let l: & f32 = & $left;
306+ let r: & f32 = & $right;
307+ let lb = l. to_bits( ) ;
308+ let rb = r. to_bits( ) ;
309+ assert_eq!( lb, rb, "float {} ({:#x}) is not equal to {} ({:#x})" , * l, lb, * r, rb) ;
310+ } ;
311+ }
312+
313+ // Ignore test on x87 floating point, these platforms do not guarantee NaN
314+ // payloads are preserved and flush denormals to zero, failing the tests.
315+ #[ cfg( not( target_arch = "x86" ) ) ]
316+ #[ test]
317+ fn test_next_up ( ) {
318+ let tiny = f32:: from_bits ( 1 ) ;
319+ let tiny_up = f32:: from_bits ( 2 ) ;
320+ let max_down = f32:: from_bits ( 0x7f7f_fffe ) ;
321+ let largest_subnormal = f32:: from_bits ( 0x007f_ffff ) ;
322+ let smallest_normal = f32:: from_bits ( 0x0080_0000 ) ;
323+ assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_up( ) , f32 :: MIN ) ;
324+ assert_f32_biteq ! ( f32 :: MIN . next_up( ) , -max_down) ;
325+ assert_f32_biteq ! ( ( -1.0 - f32 :: EPSILON ) . next_up( ) , -1.0 ) ;
326+ assert_f32_biteq ! ( ( -smallest_normal) . next_up( ) , -largest_subnormal) ;
327+ assert_f32_biteq ! ( ( -tiny_up) . next_up( ) , -tiny) ;
328+ assert_f32_biteq ! ( ( -tiny) . next_up( ) , -0.0f32 ) ;
329+ assert_f32_biteq ! ( ( -0.0f32 ) . next_up( ) , tiny) ;
330+ assert_f32_biteq ! ( 0.0f32 . next_up( ) , tiny) ;
331+ assert_f32_biteq ! ( tiny. next_up( ) , tiny_up) ;
332+ assert_f32_biteq ! ( largest_subnormal. next_up( ) , smallest_normal) ;
333+ assert_f32_biteq ! ( 1.0f32 . next_up( ) , 1.0 + f32 :: EPSILON ) ;
334+ assert_f32_biteq ! ( f32 :: MAX . next_up( ) , f32 :: INFINITY ) ;
335+ assert_f32_biteq ! ( f32 :: INFINITY . next_up( ) , f32 :: INFINITY ) ;
336+
337+ // Check that NaNs roundtrip.
338+ let nan0 = f32:: NAN ;
339+ let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x002a_aaaa ) ;
340+ let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x0055_5555 ) ;
341+ assert_f32_biteq ! ( nan0. next_up( ) , nan0) ;
342+ assert_f32_biteq ! ( nan1. next_up( ) , nan1) ;
343+ assert_f32_biteq ! ( nan2. next_up( ) , nan2) ;
344+ }
345+
346+ // Ignore test on x87 floating point, these platforms do not guarantee NaN
347+ // payloads are preserved and flush denormals to zero, failing the tests.
348+ #[ cfg( not( target_arch = "x86" ) ) ]
349+ #[ test]
350+ fn test_next_down ( ) {
351+ let tiny = f32:: from_bits ( 1 ) ;
352+ let tiny_up = f32:: from_bits ( 2 ) ;
353+ let max_down = f32:: from_bits ( 0x7f7f_fffe ) ;
354+ let largest_subnormal = f32:: from_bits ( 0x007f_ffff ) ;
355+ let smallest_normal = f32:: from_bits ( 0x0080_0000 ) ;
356+ assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_down( ) , f32 :: NEG_INFINITY ) ;
357+ assert_f32_biteq ! ( f32 :: MIN . next_down( ) , f32 :: NEG_INFINITY ) ;
358+ assert_f32_biteq ! ( ( -max_down) . next_down( ) , f32 :: MIN ) ;
359+ assert_f32_biteq ! ( ( -1.0f32 ) . next_down( ) , -1.0 - f32 :: EPSILON ) ;
360+ assert_f32_biteq ! ( ( -largest_subnormal) . next_down( ) , -smallest_normal) ;
361+ assert_f32_biteq ! ( ( -tiny) . next_down( ) , -tiny_up) ;
362+ assert_f32_biteq ! ( ( -0.0f32 ) . next_down( ) , -tiny) ;
363+ assert_f32_biteq ! ( ( 0.0f32 ) . next_down( ) , -tiny) ;
364+ assert_f32_biteq ! ( tiny. next_down( ) , 0.0f32 ) ;
365+ assert_f32_biteq ! ( tiny_up. next_down( ) , tiny) ;
366+ assert_f32_biteq ! ( smallest_normal. next_down( ) , largest_subnormal) ;
367+ assert_f32_biteq ! ( ( 1.0 + f32 :: EPSILON ) . next_down( ) , 1.0f32 ) ;
368+ assert_f32_biteq ! ( f32 :: MAX . next_down( ) , max_down) ;
369+ assert_f32_biteq ! ( f32 :: INFINITY . next_down( ) , f32 :: MAX ) ;
370+
371+ // Check that NaNs roundtrip.
372+ let nan0 = f32:: NAN ;
373+ let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x002a_aaaa ) ;
374+ let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x0055_5555 ) ;
375+ assert_f32_biteq ! ( nan0. next_down( ) , nan0) ;
376+ assert_f32_biteq ! ( nan1. next_down( ) , nan1) ;
377+ assert_f32_biteq ! ( nan2. next_down( ) , nan2) ;
378+ }
379+
302380#[ test]
303381fn test_mul_add ( ) {
304382 let nan: f32 = f32:: NAN ;
0 commit comments