@@ -2,6 +2,45 @@ use crate::f32::consts;
2
2
use crate :: num:: FpCategory as Fp ;
3
3
use crate :: num:: * ;
4
4
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
+
5
44
#[ test]
6
45
fn test_num_f32 ( ) {
7
46
test_num ( 10f32 , 2f32 ) ;
@@ -315,27 +354,16 @@ fn test_is_sign_negative() {
315
354
assert ! ( ( -f32 :: NAN ) . is_sign_negative( ) ) ;
316
355
}
317
356
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
357
// Ignore test on x87 floating point, these platforms do not guarantee NaN
330
358
// payloads are preserved and flush denormals to zero, failing the tests.
331
359
#[ cfg( not( target_arch = "x86" ) ) ]
332
360
#[ test]
333
361
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 ) ;
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 ) ;
339
367
assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_up( ) , f32 :: MIN ) ;
340
368
assert_f32_biteq ! ( f32 :: MIN . next_up( ) , -max_down) ;
341
369
assert_f32_biteq ! ( ( -1.0 - f32 :: EPSILON ) . next_up( ) , -1.0 ) ;
@@ -352,8 +380,8 @@ fn test_next_up() {
352
380
353
381
// Check that NaNs roundtrip.
354
382
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 ) ;
357
385
assert_f32_biteq ! ( nan0. next_up( ) , nan0) ;
358
386
assert_f32_biteq ! ( nan1. next_up( ) , nan1) ;
359
387
assert_f32_biteq ! ( nan2. next_up( ) , nan2) ;
@@ -364,11 +392,11 @@ fn test_next_up() {
364
392
#[ cfg( not( target_arch = "x86" ) ) ]
365
393
#[ test]
366
394
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 ) ;
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 ) ;
372
400
assert_f32_biteq ! ( f32 :: NEG_INFINITY . next_down( ) , f32 :: NEG_INFINITY ) ;
373
401
assert_f32_biteq ! ( f32 :: MIN . next_down( ) , f32 :: NEG_INFINITY ) ;
374
402
assert_f32_biteq ! ( ( -max_down) . next_down( ) , f32 :: MIN ) ;
@@ -386,8 +414,8 @@ fn test_next_down() {
386
414
387
415
// Check that NaNs roundtrip.
388
416
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 ) ;
391
419
assert_f32_biteq ! ( nan0. next_down( ) , nan0) ;
392
420
assert_f32_biteq ! ( nan1. next_down( ) , nan1) ;
393
421
assert_f32_biteq ! ( nan2. next_down( ) , nan2) ;
@@ -734,8 +762,8 @@ fn test_float_bits_conv() {
734
762
735
763
// Check that NaNs roundtrip their bits regardless of signaling-ness
736
764
// 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 ;
739
767
assert ! ( f32 :: from_bits( masked_nan1) . is_nan( ) ) ;
740
768
assert ! ( f32 :: from_bits( masked_nan2) . is_nan( ) ) ;
741
769
0 commit comments