@@ -2,6 +2,32 @@ use crate::f32::consts;
22use crate :: num:: FpCategory as Fp ;
33use crate :: num:: * ;
44
5+ /// Smallest number
6+ const TINY_BITS : u32 = 0x1 ;
7+ /// Next smallest number
8+ const TINY_UP_BITS : u32 = 0x2 ;
9+ /// Exponent = 0b11...10, Sifnificand 0b1111..10. Min val > 0
10+ const MAX_DOWN_BITS : u32 = 0x7f7f_fffe ;
11+ /// Zeroed exponent, full significant
12+ const LARGEST_SUBNORMAL_BITS : u32 = 0x007f_ffff ;
13+ /// Exponent = 0b1, zeroed significand
14+ const SMALLEST_NORMAL_BITS : u32 = 0x0080_0000 ;
15+ /// First pattern over the mantissa
16+ const NAN_MASK1 : u32 = 0x002a_aaaa ;
17+ /// Second pattern over the mantissa
18+ const NAN_MASK2 : u32 = 0x0055_5555 ;
19+
20+ #[ allow( unused_macros) ]
21+ macro_rules! assert_f32_biteq {
22+ ( $left : expr, $right : expr) => {
23+ let l: & f32 = & $left;
24+ let r: & f32 = & $right;
25+ let lb = l. to_bits( ) ;
26+ let rb = r. to_bits( ) ;
27+ assert_eq!( lb, rb, "float {l} ({lb:#010x}) is not bitequal to {r} ({rb:#010x})" ) ;
28+ } ;
29+ }
30+
531#[ test]
632fn test_num_f32 ( ) {
733 test_num ( 10f32 , 2f32 ) ;
@@ -315,27 +341,16 @@ fn test_is_sign_negative() {
315341 assert ! ( ( -f32 :: NAN ) . is_sign_negative( ) ) ;
316342}
317343
318- #[ allow( unused_macros) ]
319- macro_rules! assert_f32_biteq {
320- ( $left : expr, $right : expr) => {
321- let l: & f32 = & $left;
322- let r: & f32 = & $right;
323- let lb = l. to_bits( ) ;
324- let rb = r. to_bits( ) ;
325- assert_eq!( lb, rb, "float {} ({:#x}) is not equal to {} ({:#x})" , * l, lb, * r, rb) ;
326- } ;
327- }
328-
329344// Ignore test on x87 floating point, these platforms do not guarantee NaN
330345// payloads are preserved and flush denormals to zero, failing the tests.
331346#[ cfg( not( target_arch = "x86" ) ) ]
332347#[ test]
333348fn test_next_up ( ) {
334- let tiny = f32:: from_bits ( 1 ) ;
335- let tiny_up = f32:: from_bits ( 2 ) ;
336- let max_down = f32:: from_bits ( 0x7f7f_fffe ) ;
337- let largest_subnormal = f32:: from_bits ( 0x007f_ffff ) ;
338- let smallest_normal = f32:: from_bits ( 0x0080_0000 ) ;
349+ let tiny = f32:: from_bits ( TINY_BITS ) ;
350+ let tiny_up = f32:: from_bits ( TINY_UP_BITS ) ;
351+ let max_down = f32:: from_bits ( MAX_DOWN_BITS ) ;
352+ let largest_subnormal = f32:: from_bits ( LARGEST_SUBNORMAL_BITS ) ;
353+ let smallest_normal = f32:: from_bits ( SMALLEST_NORMAL_BITS ) ;
339354 assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_up( ) , f32 :: MIN ) ;
340355 assert_f32_biteq ! ( f32 :: MIN . next_up( ) , -max_down) ;
341356 assert_f32_biteq ! ( ( -1.0 - f32 :: EPSILON ) . next_up( ) , -1.0 ) ;
@@ -352,8 +367,8 @@ fn test_next_up() {
352367
353368 // Check that NaNs roundtrip.
354369 let nan0 = f32:: NAN ;
355- let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x002a_aaaa ) ;
356- let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x0055_5555 ) ;
370+ let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK1 ) ;
371+ let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK2 ) ;
357372 assert_f32_biteq ! ( nan0. next_up( ) , nan0) ;
358373 assert_f32_biteq ! ( nan1. next_up( ) , nan1) ;
359374 assert_f32_biteq ! ( nan2. next_up( ) , nan2) ;
@@ -364,11 +379,11 @@ fn test_next_up() {
364379#[ cfg( not( target_arch = "x86" ) ) ]
365380#[ test]
366381fn test_next_down ( ) {
367- let tiny = f32:: from_bits ( 1 ) ;
368- let tiny_up = f32:: from_bits ( 2 ) ;
369- let max_down = f32:: from_bits ( 0x7f7f_fffe ) ;
370- let largest_subnormal = f32:: from_bits ( 0x007f_ffff ) ;
371- let smallest_normal = f32:: from_bits ( 0x0080_0000 ) ;
382+ let tiny = f32:: from_bits ( TINY_BITS ) ;
383+ let tiny_up = f32:: from_bits ( TINY_UP_BITS ) ;
384+ let max_down = f32:: from_bits ( MAX_DOWN_BITS ) ;
385+ let largest_subnormal = f32:: from_bits ( LARGEST_SUBNORMAL_BITS ) ;
386+ let smallest_normal = f32:: from_bits ( SMALLEST_NORMAL_BITS ) ;
372387 assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_down( ) , f32 :: NEG_INFINITY ) ;
373388 assert_f32_biteq ! ( f32 :: MIN . next_down( ) , f32 :: NEG_INFINITY ) ;
374389 assert_f32_biteq ! ( ( -max_down) . next_down( ) , f32 :: MIN ) ;
@@ -386,8 +401,8 @@ fn test_next_down() {
386401
387402 // Check that NaNs roundtrip.
388403 let nan0 = f32:: NAN ;
389- let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x002a_aaaa ) ;
390- let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ 0x0055_5555 ) ;
404+ let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK1 ) ;
405+ let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK2 ) ;
391406 assert_f32_biteq ! ( nan0. next_down( ) , nan0) ;
392407 assert_f32_biteq ! ( nan1. next_down( ) , nan1) ;
393408 assert_f32_biteq ! ( nan2. next_down( ) , nan2) ;
@@ -734,8 +749,8 @@ fn test_float_bits_conv() {
734749
735750 // Check that NaNs roundtrip their bits regardless of signaling-ness
736751 // 0xA is 0b1010; 0x5 is 0b0101 -- so these two together clobbers all the mantissa bits
737- let masked_nan1 = f32:: NAN . to_bits ( ) ^ 0x002A_AAAA ;
738- let masked_nan2 = f32:: NAN . to_bits ( ) ^ 0x0055_5555 ;
752+ let masked_nan1 = f32:: NAN . to_bits ( ) ^ NAN_MASK1 ;
753+ let masked_nan2 = f32:: NAN . to_bits ( ) ^ NAN_MASK2 ;
739754 assert ! ( f32 :: from_bits( masked_nan1) . is_nan( ) ) ;
740755 assert ! ( f32 :: from_bits( masked_nan2) . is_nan( ) ) ;
741756
0 commit comments