@@ -2,6 +2,32 @@ use crate::f32::consts;
2
2
use crate :: num:: FpCategory as Fp ;
3
3
use crate :: num:: * ;
4
4
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
+
5
31
#[ test]
6
32
fn test_num_f32 ( ) {
7
33
test_num ( 10f32 , 2f32 ) ;
@@ -315,27 +341,16 @@ fn test_is_sign_negative() {
315
341
assert ! ( ( -f32 :: NAN ) . is_sign_negative( ) ) ;
316
342
}
317
343
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
-
329
344
// Ignore test on x87 floating point, these platforms do not guarantee NaN
330
345
// payloads are preserved and flush denormals to zero, failing the tests.
331
346
#[ cfg( not( target_arch = "x86" ) ) ]
332
347
#[ test]
333
348
fn 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 ) ;
339
354
assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_up( ) , f32 :: MIN ) ;
340
355
assert_f32_biteq ! ( f32 :: MIN . next_up( ) , -max_down) ;
341
356
assert_f32_biteq ! ( ( -1.0 - f32 :: EPSILON ) . next_up( ) , -1.0 ) ;
@@ -352,8 +367,8 @@ fn test_next_up() {
352
367
353
368
// Check that NaNs roundtrip.
354
369
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 ) ;
357
372
assert_f32_biteq ! ( nan0. next_up( ) , nan0) ;
358
373
assert_f32_biteq ! ( nan1. next_up( ) , nan1) ;
359
374
assert_f32_biteq ! ( nan2. next_up( ) , nan2) ;
@@ -364,11 +379,11 @@ fn test_next_up() {
364
379
#[ cfg( not( target_arch = "x86" ) ) ]
365
380
#[ test]
366
381
fn 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 ) ;
372
387
assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_down( ) , f32 :: NEG_INFINITY ) ;
373
388
assert_f32_biteq ! ( f32 :: MIN . next_down( ) , f32 :: NEG_INFINITY ) ;
374
389
assert_f32_biteq ! ( ( -max_down) . next_down( ) , f32 :: MIN ) ;
@@ -386,8 +401,8 @@ fn test_next_down() {
386
401
387
402
// Check that NaNs roundtrip.
388
403
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 ) ;
391
406
assert_f32_biteq ! ( nan0. next_down( ) , nan0) ;
392
407
assert_f32_biteq ! ( nan1. next_down( ) , nan1) ;
393
408
assert_f32_biteq ! ( nan2. next_down( ) , nan2) ;
@@ -734,8 +749,8 @@ fn test_float_bits_conv() {
734
749
735
750
// Check that NaNs roundtrip their bits regardless of signaling-ness
736
751
// 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 ;
739
754
assert ! ( f32 :: from_bits( masked_nan1) . is_nan( ) ) ;
740
755
assert ! ( f32 :: from_bits( masked_nan2) . is_nan( ) ) ;
741
756
0 commit comments