use crate::math;
mod hyperloglog;
pub use hyperloglog::HyperLogLog;
pub fn precision_for_error(target_error: f64) -> u8 {
let m = math::powi(1.04 / target_error, 2);
let p = math::ceil(math::log2(m)) as u8;
p.clamp(4, 18)
}
pub fn memory_for_precision(precision: u8) -> usize {
1usize << precision
}
pub fn error_for_precision(precision: u8) -> f64 {
let m = (1usize << precision) as f64;
1.04 / math::sqrt(m)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_precision_for_error() {
let p = precision_for_error(0.01);
assert!(p >= 13 && p <= 15);
let p2 = precision_for_error(0.005);
assert!(p2 > p);
}
#[test]
fn test_error_for_precision() {
let e14 = error_for_precision(14);
assert!(e14 > 0.007 && e14 < 0.009);
let e12 = error_for_precision(12);
assert!(e12 > e14); }
}