@@ -289,6 +289,81 @@ fn test_is_sign_negative() {
289
289
assert ! ( ( -f64 :: NAN ) . is_sign_negative( ) ) ;
290
290
}
291
291
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
+
292
367
#[ test]
293
368
fn test_mul_add ( ) {
294
369
let nan: f64 = f64:: NAN ;
0 commit comments