ohsl 0.12.0

A collection of numerical routines and mathematical types for use in scientific computing.
Documentation
use ohsl::complex::{Complex, Cmplx};
use ohsl::traits::{Zero, One};

#[test]
fn test_complex_abs_sqr() {
    let z = Complex::new( 1.0, 1.0 );
    let r = z.abs_sqr();
    assert_eq!( r, 2.0 );
}

#[test]
fn test_complex_abs() {
    let z = Complex::new( 3.0, 4.0 );
    let r = z.abs();
    assert_eq!( r, 5.0 );
}

#[test]
fn test_complex_arg() {
    let z = Cmplx::new( 3.0, 4.0 );
    let theta = z.arg();
    assert_eq!( theta, f64::atan( 4.0 / 3.0 ) );
}

#[test]
fn test_complex_zero() {
    let z = Complex::<i32>::zero();
    assert_eq!( z.real, 0 );
    assert_eq!( z.imag, 0 );
}

#[test]
fn test_complex_one() {
    let z = Complex::<i32>::one();
    assert_eq!( z.real, 1 );
    assert_eq!( z.imag, 0 );
}

#[test]
fn test_complex_square_root() {
    let z = Cmplx::new( 1.0, 1.0 );
    let sqrt = z.sqrt();
    assert!( (sqrt.real - 1.098684113467810).abs() < 1.0e-15 );
    assert!( (sqrt.imag - 0.455089860562227).abs() < 1.0e-15 );
}

#[test]
fn test_complex_pow() {
    let z = Cmplx::new( 1.0, 1.0 );
    let w = Cmplx::new( 2.0, 1.0 );
    let pow = z.pow( &w );
    assert!( (pow.real + 0.309743504928494).abs() < 1.0e-15 );
    assert!( (pow.imag - 0.857658012588736).abs() < 1.0e-15 );
}

#[test]
fn test_complex_powf() {
    let z = Cmplx::new( 2.0, 1.0 );
    let pow = z.powf( 2.0 );
    assert!( (pow.real - 3.0).abs() < 1.0e-15 );
    assert!( (pow.imag - 4.0).abs() < 1.0e-15 );
    let pow = z.powf( 2.5 );
    assert!( (pow.real - 2.9917970717860150).abs() < 1.0e-15 );
    assert!( (pow.imag - 6.8520690100689566).abs() < 1.0e-15 );
}

#[test]
fn test_complex_exponential() {
    let z = Cmplx::new( 1.0, 1.0 );
    let exp = z.exp();
    assert!( (exp.real - 1.468693939915885).abs() < 1.0e-15 );
    assert!( (exp.imag - 2.287355287178842).abs() < 1.0e-15 );
}

#[test]
fn test_complex_logarithm() {
    let z = Cmplx::new( 1.0, 1.0 );
    let ln = z.ln();
    assert!( (ln.real - 0.346573590279973).abs() < 1.0e-15 );
    assert!( (ln.imag - 0.785398163397448).abs() < 1.0e-15 );
}

#[test]
fn test_complex_base_b_logarithm() {
    let z = Cmplx::new( 1.0, 1.0 );
    let log = z.log( Cmplx::new( 2.0, 0.0 ) );
    assert!( (log.real - 0.5).abs() < 1.0e-15 );
    assert!( (log.imag - 1.133090035456798).abs() < 1.0e-15 );
    let log = z.log( Cmplx::new( 2.0, 1.0 ) );
    assert!( (log.real - 0.745520263590820).abs() < 1.0e-15 );
    assert!( (log.imag - 0.546450996741907).abs() < 1.0e-15 );
}