rsdiff_math/num/
mod.rs

1/*
2    Appellation: num <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5pub use self::{traits::*, utils::*};
6
7pub mod traits;
8
9pub(crate) mod utils {
10    use num::integer::Integer;
11    use num_traits::{Num, ToPrimitive, Unsigned};
12
13    pub fn harmonic<T>(n: T) -> f64
14    where
15        T: Integer + Num + ToPrimitive + Unsigned,
16    {
17        (1..=n.to_usize().unwrap()).fold(0f64, |acc, i| acc + i.to_f64().unwrap().recip())
18    }
19}
20
21#[cfg(test)]
22mod tests {
23
24    #[cfg(feature = "approx")]
25    #[test]
26    fn test_harmonic() {
27        use super::traits::NaturalNumber;
28        use approx::assert_relative_eq;
29        assert_relative_eq!(1u8.harmonic(), 1.0);
30        assert_relative_eq!(2u16.harmonic(), super::harmonic(2u16));
31        assert_relative_eq!(3u32.harmonic(), 11.0 / 6.0);
32        assert_relative_eq!(4u64.harmonic(), 25. / 12.);
33        assert_relative_eq!(5u128.harmonic(), 137. / 60.);
34        assert_relative_eq!(6usize.harmonic(), 2.4499999999999997);
35    }
36}