compiler_builtins/math/libm_math/generic/
round.rs

1use super::{copysign, trunc};
2use crate::support::{Float, MinInt};
3
4#[inline]
5pub fn round<F: Float>(x: F) -> F {
6    let f0p5 = F::from_parts(false, F::EXP_BIAS - 1, F::Int::ZERO); // 0.5
7    let f0p25 = F::from_parts(false, F::EXP_BIAS - 2, F::Int::ZERO); // 0.25
8
9    trunc(x + copysign(f0p5 - f0p25 * F::EPSILON, x))
10}
11
12#[cfg(test)]
13mod tests {
14    use super::*;
15
16    #[test]
17    #[cfg(f16_enabled)]
18    fn zeroes_f16() {
19        assert_biteq!(round(0.0_f16), 0.0_f16);
20        assert_biteq!(round(-0.0_f16), -0.0_f16);
21    }
22
23    #[test]
24    #[cfg(f16_enabled)]
25    fn sanity_check_f16() {
26        assert_eq!(round(-1.0_f16), -1.0);
27        assert_eq!(round(2.8_f16), 3.0);
28        assert_eq!(round(-0.5_f16), -1.0);
29        assert_eq!(round(0.5_f16), 1.0);
30        assert_eq!(round(-1.5_f16), -2.0);
31        assert_eq!(round(1.5_f16), 2.0);
32    }
33
34    #[test]
35    fn zeroes_f32() {
36        assert_biteq!(round(0.0_f32), 0.0_f32);
37        assert_biteq!(round(-0.0_f32), -0.0_f32);
38    }
39
40    #[test]
41    fn sanity_check_f32() {
42        assert_eq!(round(-1.0_f32), -1.0);
43        assert_eq!(round(2.8_f32), 3.0);
44        assert_eq!(round(-0.5_f32), -1.0);
45        assert_eq!(round(0.5_f32), 1.0);
46        assert_eq!(round(-1.5_f32), -2.0);
47        assert_eq!(round(1.5_f32), 2.0);
48    }
49
50    #[test]
51    fn zeroes_f64() {
52        assert_biteq!(round(0.0_f64), 0.0_f64);
53        assert_biteq!(round(-0.0_f64), -0.0_f64);
54    }
55
56    #[test]
57    fn sanity_check_f64() {
58        assert_eq!(round(-1.0_f64), -1.0);
59        assert_eq!(round(2.8_f64), 3.0);
60        assert_eq!(round(-0.5_f64), -1.0);
61        assert_eq!(round(0.5_f64), 1.0);
62        assert_eq!(round(-1.5_f64), -2.0);
63        assert_eq!(round(1.5_f64), 2.0);
64    }
65
66    #[test]
67    #[cfg(f128_enabled)]
68    fn zeroes_f128() {
69        assert_biteq!(round(0.0_f128), 0.0_f128);
70        assert_biteq!(round(-0.0_f128), -0.0_f128);
71    }
72
73    #[test]
74    #[cfg(f128_enabled)]
75    fn sanity_check_f128() {
76        assert_eq!(round(-1.0_f128), -1.0);
77        assert_eq!(round(2.8_f128), 3.0);
78        assert_eq!(round(-0.5_f128), -1.0);
79        assert_eq!(round(0.5_f128), 1.0);
80        assert_eq!(round(-1.5_f128), -2.0);
81        assert_eq!(round(1.5_f128), 2.0);
82    }
83}