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