| //! Check that the flags to control the extra rounding error work. | |
| //@revisions: random max none | |
| //@[max]compile-flags: -Zmiri-max-extra-rounding-error | |
| //@[none]compile-flags: -Zmiri-no-extra-rounding-error | |
| use std::collections::HashSet; | |
| use std::hint::black_box; | |
| fn main() { | |
| let expected = cfg_select! { | |
| random => 9, // -4 ..= +4 ULP error | |
| max => 2, | |
| none => 1, | |
| }; | |
| // Call `sin(0.5)` a bunch of times and see how many different values we get. | |
| let mut values = HashSet::new(); | |
| for _ in 0..(expected * 16) { | |
| let val = black_box(0.5f64).sin(); | |
| values.insert(val.to_bits()); | |
| } | |
| assert_eq!(values.len(), expected); | |
| if !cfg!(none) { | |
| // Ensure the smallest and biggest value are 8 ULP apart. | |
| // We can just subtract the raw bit representations for this. | |
| let min = *values.iter().min().unwrap(); | |
| let max = *values.iter().max().unwrap(); | |
| assert_eq!(min.abs_diff(max), 8); | |
| } | |
| } |