fn main() {
    let processor = ConcreteFloatProcessor;
    let data: Vec<f64> = vec![1.0, 2.0, f64::NAN, -3.0, f64::INFINITY];

    println!("Processed: {}", processor.process(&data));
    println!("Compute(4.0): {}", processor.compute(4.0));
    println!("Factorial(5): {}", float_utils::factorial(5));
    println!(
        "Sum until epsilon: {}",
        float_utils::sum_until_epsilon(1.0, 1e-5)
    );
    println!(
        "First negative: {:?}",
        float_utils::find_first_negative(&data)
    );
    println!(
        "Transcendental ops: {}",
        float_utils::transcendental_ops(PI)
    );

    let special: Vec<String> = float_utils::special_values_demo()
        .iter()
        .map(|v| v.to_string())
        .collect();
    println!("Special values: {}", special.join(", "));
}