1pub 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}