Extract repeated constants from f32
and f64
source · model-checking/verify-rust-std@6839ec5 (original) (raw)
`@@ -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
``