refined-float 0.2.0

Refined float with a subset of functions of std float
Documentation
#[cfg(feature = "approx")]
use approx::AbsDiffEq;
use refined_float::{Complex, Float32, Float64};

#[test]
fn test_conjugate() {
    assert_eq!(
        Complex::new(Float64(0.1), Float64(0.2)).conjugate(),
        Complex::new(Float64(0.1), Float64(-0.2))
    );
    let a = Complex::new(Float64(0.1), Float64(0.2));
    assert_eq!(a.conjugate().conjugate(), a);
}

#[test]
#[cfg(feature = "approx")]
fn test_add() {
    let mut a = Complex::new(Float32(0.1), Float32(0.2));
    let b = Complex::new(Float32(0.3), Float32(0.4));
    let c = Complex::new(Float32(0.4), Float32(0.6));
    assert!(
        (a + b).abs_diff_eq(&c, Float32(f32::EPSILON)),
        "a + b = {}, c = {}",
        a + b,
        c
    );
    a += b;
    assert!(a.abs_diff_eq(&c, Float32(f32::EPSILON)));
}

#[test]
#[cfg(feature = "approx")]
fn test_sub() {
    let mut a = Complex::new(Float32(0.1), Float32(0.2));
    let b = Complex::new(Float32(0.3), Float32(0.4));
    let c = Complex::new(Float32(-0.2), Float32(-0.2));

    assert!((a - b).abs_diff_eq(&c, Float32(f32::EPSILON)));
    a -= b;
    assert!(a.abs_diff_eq(&c, Float32(f32::EPSILON)));

    let d = b + c;
    let f = d - c;
    assert!(b.abs_diff_eq(&f, Float32(f32::EPSILON)));
}

#[test]
#[cfg(feature = "approx")]
fn test_mul() {
    let mut a = Complex::new(Float32(0.1), Float32(0.2));
    let b = Complex::new(Float32(0.3), Float32(0.4));
    let c = Complex::new(Float32(-0.05), Float32(0.1));
    assert!((a * b).abs_diff_eq(&c, Float32(f32::EPSILON)));
    a *= b;
    assert!(a.abs_diff_eq(&c, Float32(f32::EPSILON)));
}

#[test]
#[cfg(feature = "approx")]
fn test_div() {
    let mut a = Complex::new(Float32(0.1), Float32(0.2));
    let b = Complex::new(Float32(0.3), Float32(0.4));
    let c = Complex::new(Float32(0.44), Float32(0.08));
    assert!((a / b).abs_diff_eq(&c, Float32(f32::EPSILON)));
    a /= b;
    assert!(
        a.abs_diff_eq(&c, Float32(f32::EPSILON)),
        "a = {}, c = {}",
        a,
        c
    );

    let d = b / c;
    let f = d * c;
    assert!(b.abs_diff_eq(&f, Float32(f32::EPSILON)));
}

#[test]
fn test_neg() {
    assert_eq!(
        -Complex::new(Float32(0.3), Float32(-0.4)),
        Complex::new(Float32(-0.3), Float32(0.4))
    );

    let a = Complex::new(Float32(0.3), Float32(-0.4));
    assert_eq!(-(-a), a);
}