@@ -289,6 +289,81 @@ fn test_is_sign_negative() {
289289 assert ! ( ( -f64 :: NAN ) . is_sign_negative( ) ) ;
290290}
291291
292+ #[ test]
293+ fn test_next_up ( ) {
294+ let tiny = f64:: from_bits ( 1 ) ;
295+ let tiny_up = f64:: from_bits ( 2 ) ;
296+ let max_down = f64:: from_bits ( 0x7fef_ffff_ffff_fffe ) ;
297+ let largest_subnormal = f64:: from_bits ( 0x000f_ffff_ffff_ffff ) ;
298+ 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+
329+ #[ test]
330+ fn test_next_down ( ) {
331+ let tiny = f64:: from_bits ( 1 ) ;
332+ let tiny_up = f64:: from_bits ( 2 ) ;
333+ let max_down = f64:: from_bits ( 0x7fef_ffff_ffff_fffe ) ;
334+ let largest_subnormal = f64:: from_bits ( 0x000f_ffff_ffff_ffff ) ;
335+ 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 ) ;
365+ }
366+
292367#[ test]
293368fn test_mul_add ( ) {
294369 let nan: f64 = f64:: NAN ;
0 commit comments