GCC Code Coverage Report


Directory: include/polyfloat/
File: include/polyfloat/module/math/details/cody_waite_reduce.hpp
Date: 2026-11-09 15:28:50
Exec Total Coverage
Lines: 14 14 100.0%
Functions: 16 16 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 //======================================================================================================================
2 /*
3 POLYFLOAT - Extended precision floating points
4 Copyright : POLYFLOAT Contributors & Maintainers
5 SPDX-License-Identifier: BSL-1.0
6 */
7 //======================================================================================================================
8 #pragma once
9
10 #include <polyfloat/details/callable.hpp>
11 #include <polyfloat/types/concepts.hpp>
12 #include <polyfloat/types/traits.hpp>
13 #include <type_traits>
14 #include <polyfloat/module/core/fma.hpp>
15 #include <polyfloat/module/core/nearest.hpp>
16 #include <polyfloat/module/core/quadrant.hpp>
17 #include <eve/traits/helpers.hpp>
18
19 namespace plf::_
20 {
21
22 template<typename X, typename C, typename Cn, typename C0, typename... Cs>
23 1120 constexpr auto cody_waite_reduce(X x, C invc, Cn lastc, C0 c0, Cs... cs) noexcept
24 {
25 using r_t = as_polyfloat_like_t<X, C, Cn, C0, Cs...>;
26 1120 auto xn = -plf::nearest(x * invc);
27 1120 r_t that = plf::fma(c0, xn, x);
28 1120 ((that = plf::fma(cs, xn, that)), ...);
29 1120 auto da = xn * lastc;
30 1120 auto a = that + da;
31 1120 da = (that - a) + da;
32 1120 auto n = plf::quadrant(-xn);
33 1120 return eve::zip(n, a, da);
34 }
35
36 template<typename X, typename C, eve::product_type Tuple>
37 1120 constexpr auto cody_waite_reduce(X x, C invc, eve::coefficients<Tuple> const& tup) noexcept
38 {
39 1120 constexpr auto lst = kumi::size_v<Tuple> - 1;
40 1120 auto butlast = kumi::extract(tup, kumi::index<0>, kumi::index<lst>);
41 1120 auto last = kumi::get<lst>(tup);
42 2800 return kumi::apply([&](auto... m) { return plf::_::cody_waite_reduce(x, invc, last, m...); }, butlast);
43 }
44 }
45