/*! \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