GCC Code Coverage Report


Directory: include/polyfloat/
File: include/polyfloat/module/math/sin.hpp
Date: 2026-11-09 15:28:50
Exec Total Coverage
Lines: 15 18 83.3%
Functions: 112 148 75.7%
Branches: 1 4 25.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/math/details/sincos_coefs.hpp>
15 #include <polyfloat/module/math/details/trig_finalize.hpp>
16 #include <polyfloat/module/math/details/rempio2_limits.hpp>
17 #include <polyfloat/module/math/details/pio2_reduce.hpp>
18
19 namespace plf
20 {
21
22 template<typename Options>
23 struct sin_t : plf::elementwise_callable<sin_t,
24 eve::sin_t,
25 Options,
26 raw_option,
27 pedantic_option,
28 eve::quarter_circle_option,
29 eve::half_circle_option,
30 eve::full_circle_option,
31 eve::medium_option,
32 eve::big_option,
33 eve::radpi_option,
34 eve::deg_option>
35 {
36 338 template<concepts::polyfloat_like Z> POLYFLOAT_ABI constexpr Z operator()(Z z) const noexcept
37 {
38 338 return POLYFLOAT_CALL(z);
39 }
40
41 328 POLYFLOAT_CALLABLE_OBJECT(sin_t, sin_);
42 };
43 //======================================================================================================================
44 //! @addtogroup math
45 //! @{
46 //! @var sin
47 //! @brief return the sine value.
48 //!
49 //! @groupheader{Header file}
50 //!
51 //! @code
52 //! #include <polyfloat/core.hpp>
53 //! @endcode
54 //!
55 //! @groupheader{Callable Signatures}
56 //!
57 //! @code
58 //! namespace polyfloat
59 //! {
60 //! template<polyfloat::concepts::polyfloat_like T> constexpr auto sin(T z) noexcept;
61 //! }
62 //! @endcode
63 //!
64 //! **Parameters**
65 //!
66 //! * `z`: Value to process.
67 //!
68 //! **Return value**
69 //!
70 //! Returns the sine of z.
71 //!
72 //! @groupheader{Example}
73 //!
74 //! @godbolt{doc/math/sin.cpp}
75 //======================================================================================================================
76
77 inline constexpr auto sin = eve::functor<sin_t>;
78 //======================================================================================================================
79 //! @}
80 //======================================================================================================================
81 }
82
83 namespace plf::_
84 {
85 328 template<typename T, eve::callable_options O> constexpr auto sin_(POLYFLOAT_DELAY(), O const&, T a0) noexcept
86 {
87 if constexpr (O::contains(eve::deg))
88 {
89 56 return plf::sin[eve::radpi](plf::div_180(a0));
90 }
91 else if constexpr (O::contains(eve::radpi))
92 {
93 if constexpr (O::contains(quarter_circle))
94 {
95 return eve::sin_kernel[quarter_circle](a0 * pi(eve::as<T>()));
96 }
97 else
98 {
99 56 auto x = plf::abs(a0);
100 56 x = plf::if_else(plf::is_not_finite(x), plf::nan(eve::as(x)), x); // nan or Inf input
101 56 x = plf::if_else(plf::is_greater(x, plf::maxflint(eve::as(x))), eve::zero, x);
102 168 auto [fn, xr, dxr] = plf::rem2(x);
103 56 return sin_finalize(a0, fn, xr, dxr);
104 }
105 }
106 else
107 {
108 if constexpr (O::contains(eve::quarter_circle))
109 {
110 36 return sin_eval(plf::sqr(a0), a0);
111 }
112 else if constexpr (O::contains(eve::half_circle) || O::contains(eve::full_circle) || O::contains(eve::medium))
113 {
114 432 auto [fn, xr, dxr] = pio_2_reduce(plf::abs(a0));
115 144 return plf::_::sin_finalize(a0, fn, xr, dxr);
116 }
117 else
118 {
119 36 auto x = abs(a0);
120
1/2
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
36 if (eve::all(x <= Rempio2_limit[quarter_circle](as(a0)))) return sin[quarter_circle](a0);
121 ✗ else if (eve::all(x <= Rempio2_limit[medium](as(a0)))) return sin[medium](a0);
122 else
123 ✗ return sin[medium](
124 ✗ plf::if_else(is_not_less_equal(x, Rempio2_limit[medium](as(a0))), nan(eve::as(a0)), sin[medium](a0)));
125 //else return sin[big](a0); TO DO REPLACE previous line
126 }
127 }
128 }
129 }
130
131 namespace plf
132 {
133 constexpr auto sind = plf::sin[eve::deg];
134 constexpr auto sinpi = plf::sin[eve::radpi];
135 }
136