numberlab 0.1.9

A collection of numerical algorithms
Documentation
use numberlab::sequence::geometric::{geometric_sequence, geometric_series, nth_geometric};

fn round_to_precision(number: f64, precision: u8) -> f64 {
    (number * 10f64.powf(precision as f64)).round() / 10f64.powf(precision as f64)
}

#[test]
#[should_panic(expected = "'n' (0) must be greater than 0")]
fn nth_geometric_should_panic_when_n_is_less_than_1() {
    nth_geometric(1.0, 1.0, 0);
}

#[test]
fn should_calculate_nth_geometric() {
    assert_eq!(round_to_precision(nth_geometric(1.0, 1.2, 1), 5), 1.0);
    assert_eq!(round_to_precision(nth_geometric(1.0, 1.2, 2), 5), 1.2);
    assert_eq!(round_to_precision(nth_geometric(1.0, 1.2, 3), 5), 1.44);
    assert_eq!(round_to_precision(nth_geometric(1.0, 1.2, 4), 5), 1.728);
    assert_eq!(round_to_precision(nth_geometric(1.0, 1.2, 5), 5), 2.0736);
}

#[test]
fn should_generate_geometric_sequence() {
    assert_eq!(geometric_sequence(1.0, 1.2, 0), vec![]);
    assert_eq!(geometric_sequence(1.0, 1.2, 1), vec![1.0]);

    let sequence = geometric_sequence(1.0, 1.2, 5)
        .iter()
        .map(|n| round_to_precision(*n, 5))
        .collect::<Vec<f64>>();
    assert_eq!(sequence, vec![1.0, 1.2, 1.44, 1.728, 2.0736]);

    let sequence = geometric_sequence(1.0, 1.3, 5)
        .iter()
        .map(|n| round_to_precision(*n, 5))
        .collect::<Vec<f64>>();
    assert_eq!(sequence, vec![1.0, 1.3, 1.69, 2.197, 2.8561]);
}

#[test]
fn should_calculate_geometric_series() {
    assert_eq!(round_to_precision(geometric_series(1.0, 1.0, 0), 6), 0.0);
    assert_eq!(round_to_precision(geometric_series(1.0, 1.0, 1), 6), 1.0);
    assert_eq!(round_to_precision(geometric_series(1.0, 1.0, 2), 6), 2.0);
    assert_eq!(round_to_precision(geometric_series(1.0, 1.0, 3), 6), 3.0);
    assert_eq!(round_to_precision(geometric_series(1.0, 1.0, 4), 6), 4.0);
    assert_eq!(round_to_precision(geometric_series(1.0, 1.3, 5), 6), 9.0431);
    assert_eq!(
        round_to_precision(geometric_series(1.0, 1.3, 6), 6),
        12.75603
    );
    assert_eq!(
        round_to_precision(geometric_series(1.0, 1.3, 7), 6),
        17.582839
    );
}