src/math/kahan/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../util/util/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | template <std::floating_point FP> | ||
| 8 | class kahan_fp { | ||
| 9 | FP sum, c{0}; | ||
| 10 | |||
| 11 | public: | ||
| 12 | 1615 | CEXP kahan_fp(FP val = 0) NE : sum{val} {} | |
| 13 | |||
| 14 | 185691 | CEXP kahan_fp& operator+=(FP x) NE { | |
| 15 | 185691 | const FP y = x - c; | |
| 16 | 185691 | volatile FP t = sum + y, z = t - sum; | |
| 17 | 185691 | c = z - y, sum = t; | |
| 18 | 185691 | return *this; | |
| 19 | } | ||
| 20 | 1659 | CEXP operator FP() CNE { return sum; } | |
| 21 | }; | ||
| 22 | template <class FP> | ||
| 23 | using kahan = std::conditional_t<std::floating_point<FP>, kahan_fp<FP>, FP>; | ||
| 24 | |||
| 25 | } // namespace tifa_libs | ||
| 26 |