use accurate::{sum::Sum2, traits::*};
use num::complex::Complex64;
#[derive(Clone)]
pub struct AccurateF64 {
sum: Sum2<f64>,
}
impl AccurateF64 {
pub fn zero() -> Self {
Self { sum: Sum2::zero() }
}
pub fn push(&mut self, value: f64) {
let sum = std::mem::replace(&mut self.sum, Sum2::zero());
self.sum = sum + value;
}
pub fn merge(&mut self, other: Self) {
self.push(other.finish());
}
pub fn finish(self) -> f64 {
self.sum.sum()
}
}
#[derive(Clone)]
pub struct AccurateComplex64 {
re: AccurateF64,
im: AccurateF64,
}
impl AccurateComplex64 {
pub fn zero() -> Self {
Self {
re: AccurateF64::zero(),
im: AccurateF64::zero(),
}
}
pub fn push(&mut self, value: Complex64) {
self.re.push(value.re);
self.im.push(value.im);
}
pub fn merge(&mut self, other: Self) {
self.re.merge(other.re);
self.im.merge(other.im);
}
pub fn finish(self) -> Complex64 {
Complex64::new(self.re.finish(), self.im.finish())
}
}