1 | use super::super::{Float, MinInt}; |
2 | use super::{copysign, trunc}; |
3 | |
4 | #[inline ] |
5 | pub fn round<F: Float>(x: F) -> F { |
6 | let f0p5: F = F::from_parts(negative:false, F::EXP_BIAS - 1, F::Int::ZERO); // 0.5 |
7 | let f0p25: F = F::from_parts(negative:false, F::EXP_BIAS - 2, F::Int::ZERO); // 0.25 |
8 | |
9 | trunc(x + copysign(x:f0p5 - f0p25 * F::EPSILON, y:x)) |
10 | } |
11 | |
12 | #[cfg (test)] |
13 | mod 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 | } |
84 | |