diff --git a/src/include/serif/utils/misc/compensated_sum.hpp b/src/include/serif/utils/misc/compensated_sum.hpp new file mode 100644 index 00000000..7c12dd86 --- /dev/null +++ b/src/include/serif/utils/misc/compensated_sum.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace serif::utils { + /// Neumaier summation retains small terms when a scalar reduction contains cancellation. + class CompensatedSum final { + public: + void add(const double value) { + const double next = m_sum + value; + m_correction += std::abs(m_sum) >= std::abs(value) ? (m_sum - next) + value : (value - next) + m_sum; + m_sum = next; + } + + [[nodiscard]] double value() const { return m_sum + m_correction; } + + private: + double m_sum{0.0}; + double m_correction{0.0}; + }; +} diff --git a/src/include/serif/utils/misc/concepts/enumeration.hpp b/src/include/serif/utils/misc/concepts/enumeration.hpp deleted file mode 100644 index ea76794e..00000000 --- a/src/include/serif/utils/misc/concepts/enumeration.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "serif/utils/misc/concepts/concat.hpp" -#include "serif/utils/types/type_list.hpp" - -namespace serif::utils::misc::concepts { - // Might make sense to rename these to FlatMap or some such - template typename Descriptor> - struct EnumerateTypes; - - template