ft_lib 1.0.3

Manual implementation of some math functions.
Documentation
pub fn ft_powi(number: f64, power: i32) -> f64 {
    let mut result: f64 = 1.0;
    let mut n: f64 = number;
    let mut p: i32 = power;

    if p < 0 {
        n = 1.0 / n;
        p = -p;
    }

    while p > 0 {
        if p % 2 == 1 {
            result *= n;
        }
        n *= n;
        p /= 2;
    }

    result
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_positive_power() {
        assert!((ft_powi(2.0, 3) - 8.0).abs() < 1e-10);
        assert!((ft_powi(5.0, 0) - 1.0).abs() < 1e-10);
        assert!((ft_powi(3.0, 4) - 81.0).abs() < 1e-10);
    }

    #[test]
    fn test_negative_power() {
        assert!((ft_powi(2.0, -3) - 0.125).abs() < 1e-10);
        assert!((ft_powi(5.0, -2) - 0.04).abs() < 1e-10);
        assert!((ft_powi(10.0, -1) - 0.1).abs() < 1e-10);
    }

    #[test]
    fn test_zero_and_one_base() {
        assert!((ft_powi(0.0, 5) - 0.0).abs() < 1e-10);
        assert!((ft_powi(1.0, 1000) - 1.0).abs() < 1e-10);
        assert!((ft_powi(0.0, 0) - 1.0).abs() < 1e-10);
    }

    #[test]
    fn test_negative_base() {
        assert!((ft_powi(-2.0, 3) - (-8.0)).abs() < 1e-10);
        assert!((ft_powi(-2.0, 4) - 16.0).abs() < 1e-10);
    }

    #[test]
    fn test_positive_exponent() {
        assert_eq!(ft_powi(2.0, 3), 8.0);
        assert_eq!(ft_powi(5.0, 4), 625.0);
        assert_eq!(ft_powi(1.5, 3), 3.375);
        assert_eq!(ft_powi(10.0, 0), 1.0);
        assert_eq!(ft_powi(0.0, 5), 0.0);
    }

    #[test]
    fn test_negative_exponent() {
        assert_eq!(ft_powi(2.0, -3), 0.125);
        assert!((ft_powi(5.0, -2) - 0.04).abs() < 1e-10);
        assert_eq!(ft_powi(1.5, -3), 0.2962962962962963);
        assert_eq!(ft_powi(10.0, -0), 1.0);
    }

    #[test]
    fn test_zero_base() {
        assert_eq!(ft_powi(0.0, 5), 0.0);
        assert_eq!(ft_powi(0.0, 0), 1.0);
        assert_eq!(ft_powi(0.0, -3), f64::INFINITY);
    }

    #[test]
    fn test_one_base() {
        assert_eq!(ft_powi(1.0, 100), 1.0);
        assert_eq!(ft_powi(1.0, -100), 1.0);
        assert_eq!(ft_powi(1.0, 0), 1.0);
    }

    #[test]
    fn test_large_exponents() {
        assert_eq!(ft_powi(2.0, 30), 1073741824.0);
        assert_eq!(ft_powi(2.0, -30), 9.313225746154785e-10);
        assert!((ft_powi(1.0001, 10000) - 2.7181459268249255).abs() < 1e-10);
    }

    #[test]
    fn test_fractional_base() {
        assert_eq!(ft_powi(0.5, 2), 0.25);
        assert_eq!(ft_powi(0.5, -2), 4.0);
        assert_eq!(ft_powi(2.5, 3), 15.625);
    }

    #[test]
    fn test_edge_cases() {
        assert_eq!(ft_powi(f64::MAX, 1), f64::MAX);
        assert_eq!(ft_powi(f64::MIN_POSITIVE, 1), f64::MIN_POSITIVE);
        assert_eq!(ft_powi(f64::INFINITY, 2), f64::INFINITY);
        assert_eq!(ft_powi(f64::NEG_INFINITY, 3), f64::NEG_INFINITY);
        assert!(ft_powi(f64::NAN, 5).is_nan());
    }
}