pub const BENFORD_EXPECTED_PERCENTAGES: [f64; 9] = [
30.103, 17.609, 12.494, 9.691, 7.918, 6.695, 5.799, 5.115, 4.576, ];
pub fn get_first_digit(number: f64) -> Option<u8> {
let abs_num = number.abs();
if abs_num < 1.0 {
return None; }
let mut digit = abs_num;
while digit >= 10.0 {
digit /= 10.0;
}
let first_digit = digit as u8;
if (1..=9).contains(&first_digit) {
Some(first_digit)
} else {
None
}
}
pub fn calculate_digit_distribution(numbers: &[f64]) -> [f64; 9] {
let mut counts = [0; 9];
let mut total_valid = 0;
for &number in numbers {
if let Some(digit) = get_first_digit(number) {
counts[(digit - 1) as usize] += 1;
total_valid += 1;
}
}
let mut distribution = [0.0; 9];
if total_valid > 0 {
for i in 0..9 {
distribution[i] = (counts[i] as f64 / total_valid as f64) * 100.0;
}
}
distribution
}
pub fn analyze_benford_law(
numbers: &[f64],
dataset_name: &str,
) -> crate::error::Result<crate::laws::benford::BenfordResult> {
crate::laws::benford::BenfordResult::new(dataset_name.to_string(), numbers)
}