scalars 0.3.0

Minimal numeric traits: Zero, One, Inv, Sqrt, Exp, Logarithm, Trigonometry, Real, Integer
Documentation
use scalars::{
    Clamp, Exp, Integer, Inv, InverseTrigonometry, Numeric, One, Real, Sqrt, Trigonometry, Zero,
};

#[test]
fn f32_is_real() {
    fn assert_real<T: Real>() {}
    assert_real::<f32>();
    assert_real::<f64>();
}

#[test]
fn integers_are_integer() {
    fn assert_integer<T: Integer>() {}
    assert_integer::<i32>();
    assert_integer::<u64>();
    assert_integer::<usize>();
}

#[test]
fn f32_is_numeric() {
    fn assert_numeric<T: Numeric>() {}
    assert_numeric::<f32>();
    assert_numeric::<i32>();
    assert_numeric::<u8>();
}

#[test]
fn zero_one() {
    assert!(f32::is_zero(&f32::zero()));
    assert!(f64::is_one(&f64::one()));
    assert!(i32::is_zero(&i32::zero()));
    assert!(u8::is_one(&u8::one()));
}

#[test]
fn inv() {
    assert_eq!(Inv::inv(2.0f32), 0.5);
    assert_eq!(Inv::inv(4.0f64), 0.25);
}

#[test]
fn sqrt() {
    assert_eq!(Sqrt::sqrt(4.0f32), 2.0);
    assert_eq!(Sqrt::sqrt(9.0f64), 3.0);
}

#[test]
fn exp() {
    assert!((Exp::exp(0.0f32) - 1.0).abs() < 1e-6);
    assert!((Exp::exp2(3.0f32) - 8.0).abs() < 1e-6);
}

#[test]
fn trigonometry() {
    let [sin, cos] = Trigonometry::sin_cos(0.0f32);
    assert!((sin - 0.0).abs() < 1e-6);
    assert!((cos - 1.0).abs() < 1e-6);
    assert!((Trigonometry::tan(0.0f32)).abs() < 1e-6);
}

#[test]
fn inverse_trigonometry() {
    assert!((InverseTrigonometry::asin(0.0f32)).abs() < 1e-6);
    assert!((InverseTrigonometry::acos(1.0f32)).abs() < 1e-6);
    assert!((InverseTrigonometry::atan(0.0f32)).abs() < 1e-6);
    let angle = InverseTrigonometry::atan2(1.0f32, 1.0);
    assert!((angle - core::f32::consts::FRAC_PI_4).abs() < 1e-6);
}

#[test]
fn clamp() {
    assert_eq!(Clamp::min(3.0f32, 5.0), 3.0);
    assert_eq!(Clamp::max(3.0f32, 5.0), 5.0);
    assert_eq!(Clamp::clamp(10.0f32, 0.0, 5.0), 5.0);
    assert_eq!(Clamp::clamp(-1.0f32, 0.0, 5.0), 0.0);
    assert_eq!(Clamp::min(3i32, 5), 3);
    assert_eq!(Clamp::max(3i32, 5), 5);
}