@@ -299,6 +299,84 @@ fn test_is_sign_negative() {
299
299
assert ! ( ( -f32 :: NAN ) . is_sign_negative( ) ) ;
300
300
}
301
301
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
+
302
380
#[ test]
303
381
fn test_mul_add ( ) {
304
382
let nan: f32 = f32:: NAN ;
0 commit comments