qpms/qpms/kahansum.h

39 lines
979 B
C

/*! \file kahansum.h
* \brief Inline functions providing Kahan summation.
*/
#ifndef KAHANSUM_H
#define KAHANSUM_H
#ifdef __cplusplus
extern "C" {
#endif
static inline void kahaninit(double * const sum, double * const compensation) {
*sum = 0;
*compensation = 0;
}
static inline void kahanadd(double *sum, double *compensation, double input) {
double compensated_input = input - *compensation;
double nsum = *sum + compensated_input;
*compensation = (nsum - *sum) - compensated_input;
*sum = nsum;
}
static inline void ckahaninit(_Complex double * const sum, _Complex double * const compensation) {
*sum = 0;
*compensation = 0;
}
static inline void ckahanadd(_Complex double *sum, _Complex double *compensation, _Complex double input) {
_Complex double compensated_input = input - *compensation;
_Complex double nsum = *sum + compensated_input;
*compensation = (nsum - *sum) - compensated_input;
*sum = nsum;
}
#ifdef __cplusplus
}
#endif
#endif //KAHANSUM_H