[go: up one dir, main page]

accurate 0.4.1

(more or less) accurate floating point algorithms
Documentation
extern crate accurate;
extern crate rand;

#[cfg(feature = "parallel")]
extern crate rayon;

use rand::distributions::Standard;
use rand::prelude::*;

#[cfg(feature = "parallel")]
use rayon::prelude::*;

use accurate::sum::OnlineExactSum;
use accurate::traits::*;

fn mk_vec<T>(n: usize) -> Vec<T>
where
    Standard: Distribution<T>,
{
    let rng = rand::thread_rng();
    rng.sample_iter::<T, _>(&Standard).take(n).collect()
}

#[test]
fn oes_add() {
    let xs = mk_vec::<f64>(100_000);
    let ys = mk_vec::<f64>(100_000);

    let s = OnlineExactSum::zero()
        .absorb(xs.iter().cloned())
        .absorb(ys.iter().cloned());

    let s1 = OnlineExactSum::zero().absorb(xs.iter().cloned());

    let s2 = OnlineExactSum::zero().absorb(ys.iter().cloned());

    assert_eq!(s.sum(), (s1 + s2).sum());
}

#[cfg(feature = "parallel")]
#[test]
fn parallel_sum_oes() {
    let xs = mk_vec::<f64>(100_000);

    let s1 = xs
        .par_iter()
        .map(|&x| x)
        .parallel_sum_with_accumulator::<OnlineExactSum<_>>();
    let s2 = xs
        .iter()
        .cloned()
        .sum_with_accumulator::<OnlineExactSum<_>>();

    assert_eq!(s1, s2);
}