compiler_builtins/math/libm_math/generic/
round.rs1use 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); let f0p25 = F::from_parts(false, F::EXP_BIAS - 2, F::Int::ZERO); 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}