nikisas/math/
cos.rs

1use super::data::PI_HALF;
2use super::sin::sin;
3use crate::float::F;
4use crate::utils::f;
5
6/// Computes the cosine of a number in radians.
7///
8/// # Notes
9///
10/// The input domain is limited to approximately [-2.1e+9, 2.1e+9] due to
11/// implementation details (see [`sin`]).
12///
13/// # Examples
14///
15/// ```
16/// use nikisas::{cos, consts::PI};
17/// assert_eq!(cos(PI), -1.0);
18/// ```
19///
20/// # Implementations details
21///
22/// It is simply computed as sin(x + pi/2) using [`sin`] routine.
23///
24/// [`sin`]: fn.sin.html
25pub fn cos(x: F) -> F {
26    sin(x + f(PI_HALF))
27}
28
29#[cfg(test)]
30mod tests {
31    use crate::test::error_bounds;
32    use nikisas_test::prelude::*;
33
34    #[test]
35    fn cos() {
36        assert_eq!(super::cos(0.0), 1.0);
37        assert_eq!(super::cos(core::f32::consts::PI * 0.5), 0.0);
38        assert_eq!(super::cos(core::f32::consts::PI), -1.0);
39        assert_eq!(super::cos(core::f32::consts::PI * 1.5), 0.0);
40
41        UniformSample::with_count(-core::f32::consts::PI, core::f32::consts::PI, 100000)
42            .assert(error_bounds(), |x| (super::cos(x), x.cos()));
43
44        UniformSample::with_count(-2.1e+9, 2.1e+9, 10000)
45            .assert(error_bounds(), |x| (super::cos(x), x.cos()));
46    }
47}