39 lines
979 B
C
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
|