@@ -2,6 +2,45 @@ use crate::f32::consts;
22use crate :: num:: FpCategory as Fp ;
33use crate :: num:: * ;
44
5+ /// Smallest number
6+ #[ allow( dead_code) ] // unused on x86
7+ const TINY_BITS : u32 = 0x1 ;
8+
9+ /// Next smallest number
10+ #[ allow( dead_code) ] // unused on x86
11+ const TINY_UP_BITS : u32 = 0x2 ;
12+
13+ /// Exponent = 0b11...10, Sifnificand 0b1111..10. Min val > 0
14+ #[ allow( dead_code) ] // unused on x86
15+ const MAX_DOWN_BITS : u32 = 0x7f7f_fffe ;
16+
17+ /// Zeroed exponent, full significant
18+ #[ allow( dead_code) ] // unused on x86
19+ const LARGEST_SUBNORMAL_BITS : u32 = 0x007f_ffff ;
20+
21+ /// Exponent = 0b1, zeroed significand
22+ #[ allow( dead_code) ] // unused on x86
23+ const SMALLEST_NORMAL_BITS : u32 = 0x0080_0000 ;
24+
25+ /// First pattern over the mantissa
26+ #[ allow( dead_code) ] // unused on x86
27+ const NAN_MASK1 : u32 = 0x002a_aaaa ;
28+
29+ /// Second pattern over the mantissa
30+ #[ allow( dead_code) ] // unused on x86
31+ const NAN_MASK2 : u32 = 0x0055_5555 ;
32+
33+ #[ allow( unused_macros) ]
34+ macro_rules! assert_f32_biteq {
35+ ( $left : expr, $right : expr) => {
36+ let l: & f32 = & $left;
37+ let r: & f32 = & $right;
38+ let lb = l. to_bits( ) ;
39+ let rb = r. to_bits( ) ;
40+ assert_eq!( lb, rb, "float {l} ({lb:#010x}) is not bitequal to {r} ({rb:#010x})" ) ;
41+ } ;
42+ }
43+
544#[ test]
645fn test_num_f32 ( ) {
746 test_num ( 10f32 , 2f32 ) ;
@@ -315,27 +354,16 @@ fn test_is_sign_negative() {
315354 assert ! ( ( -f32 :: NAN ) . is_sign_negative( ) ) ;
316355}
317356
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-
329357// Ignore test on x87 floating point, these platforms do not guarantee NaN
330358// payloads are preserved and flush denormals to zero, failing the tests.
331359#[ cfg( not( target_arch = "x86" ) ) ]
332360#[ test]
333361fn 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 ) ;
362+ let tiny = f32:: from_bits ( TINY_BITS ) ;
363+ let tiny_up = f32:: from_bits ( TINY_UP_BITS ) ;
364+ let max_down = f32:: from_bits ( MAX_DOWN_BITS ) ;
365+ let largest_subnormal = f32:: from_bits ( LARGEST_SUBNORMAL_BITS ) ;
366+ let smallest_normal = f32:: from_bits ( SMALLEST_NORMAL_BITS ) ;
339367 assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_up( ) , f32 :: MIN ) ;
340368 assert_f32_biteq ! ( f32 :: MIN . next_up( ) , -max_down) ;
341369 assert_f32_biteq ! ( ( -1.0 - f32 :: EPSILON ) . next_up( ) , -1.0 ) ;
@@ -352,8 +380,8 @@ fn test_next_up() {
352380
353381 // Check that NaNs roundtrip.
354382 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 ) ;
383+ let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK1 ) ;
384+ let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK2 ) ;
357385 assert_f32_biteq ! ( nan0. next_up( ) , nan0) ;
358386 assert_f32_biteq ! ( nan1. next_up( ) , nan1) ;
359387 assert_f32_biteq ! ( nan2. next_up( ) , nan2) ;
@@ -364,11 +392,11 @@ fn test_next_up() {
364392#[ cfg( not( target_arch = "x86" ) ) ]
365393#[ test]
366394fn 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 ) ;
395+ let tiny = f32:: from_bits ( TINY_BITS ) ;
396+ let tiny_up = f32:: from_bits ( TINY_UP_BITS ) ;
397+ let max_down = f32:: from_bits ( MAX_DOWN_BITS ) ;
398+ let largest_subnormal = f32:: from_bits ( LARGEST_SUBNORMAL_BITS ) ;
399+ let smallest_normal = f32:: from_bits ( SMALLEST_NORMAL_BITS ) ;
372400 assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_down( ) , f32 :: NEG_INFINITY ) ;
373401 assert_f32_biteq ! ( f32 :: MIN . next_down( ) , f32 :: NEG_INFINITY ) ;
374402 assert_f32_biteq ! ( ( -max_down) . next_down( ) , f32 :: MIN ) ;
@@ -386,8 +414,8 @@ fn test_next_down() {
386414
387415 // Check that NaNs roundtrip.
388416 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 ) ;
417+ let nan1 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK1 ) ;
418+ let nan2 = f32:: from_bits ( f32:: NAN . to_bits ( ) ^ NAN_MASK2 ) ;
391419 assert_f32_biteq ! ( nan0. next_down( ) , nan0) ;
392420 assert_f32_biteq ! ( nan1. next_down( ) , nan1) ;
393421 assert_f32_biteq ! ( nan2. next_down( ) , nan2) ;
@@ -734,8 +762,8 @@ fn test_float_bits_conv() {
734762
735763 // Check that NaNs roundtrip their bits regardless of signaling-ness
736764 // 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 ;
765+ let masked_nan1 = f32:: NAN . to_bits ( ) ^ NAN_MASK1 ;
766+ let masked_nan2 = f32:: NAN . to_bits ( ) ^ NAN_MASK2 ;
739767 assert ! ( f32 :: from_bits( masked_nan1) . is_nan( ) ) ;
740768 assert ! ( f32 :: from_bits( masked_nan2) . is_nan( ) ) ;
741769
0 commit comments