| 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 | namespace plf::_ | ||
| 11 | { | ||
| 12 | |||
| 13 | // Sollya coefficients for sin and cos remez polynomials on [0, pi/4] | ||
| 14 | |||
| 15 | 600 | template<typename T> auto cos_coefs() | |
| 16 | { | ||
| 17 | if constexpr (std::is_same_v<T, float>) | ||
| 18 | { | ||
| 19 | return kumi::tuple{T(0x1p+0f), T(0x1p-1f), T(0x1.55554ap-5f), T(-0x1.6c0c32p-10f), T(0x1.99eb9cp-16f)}; | ||
| 20 | } | ||
| 21 | else if constexpr (std::is_same_v<T, double>) | ||
| 22 | { | ||
| 23 | return kumi::tuple{T(0x1p+0), | ||
| 24 | T(0x1.p-1), | ||
| 25 | T(-0x1.5555555555551p-5), | ||
| 26 | T(0x1.6c16c16c15d47p-10), | ||
| 27 | T(-0x1.a01a019ddbcd9p-16), | ||
| 28 | T(0x1.27e4f8e06d9a5p-22), | ||
| 29 | T(-0x1.1eea7c1e514d4p-29), | ||
| 30 | T(0x1.8ff831ad9b219p-37)}; | ||
| 31 | } | ||
| 32 | else if constexpr (std::same_as<T, double_real_t<float>>) | ||
| 33 | { | ||
| 34 | //using r_t = double_real_t<float> | ||
| 35 | 140 | return kumi::tuple{plf::_::from_pair<float>(0x1p+0f, +0x0p+0f), | |
| 36 | 140 | plf::_::from_pair<float>(-0x1p-1f, +0x1.8p-48f), | |
| 37 | 140 | plf::_::from_pair<float>(0x1.555556p-5f, -0x1.55614p-30f), | |
| 38 | 140 | plf::_::from_pair<float>(-0x1.6c16c2p-10f, +0x1.376484p-35f), | |
| 39 | 140 | plf::_::from_pair<float>(0x1.a019f8p-16f, +0x1.33c19p-42f), | |
| 40 | 140 | plf::_::from_pair<float>(-0x1.27df56p-22f, -0x1.fe7cbp-49f), | |
| 41 | 140 | plf::_::from_pair<float>(0x1.1b8fbcp-29f, -0x1.3ccf8p-58)}; | |
| 42 | } | ||
| 43 | else if constexpr (std::same_as<T, triple_real_t<float>>) | ||
| 44 | { | ||
| 45 | //using r_t = double_real_t<float>; | ||
| 46 | 122 | return kumi::tuple{plf::_::from_triple<float>(0x1p+0f, +0x0p+0f, +0x0p+0f), | |
| 47 | 122 | plf::_::from_triple<float>(-0x1p-1f, +0x1p-68f, +0x0p+0f), | |
| 48 | 122 | plf::_::from_triple<float>(0x1.555556p-5f, -0x1.555556p-30f, +0x1.53c8cp-55f), | |
| 49 | 122 | plf::_::from_triple<float>(-0x1.6c16c2p-10f, +0x1.27d27ep-35f, +0x1.a71a8p-60f), | |
| 50 | 122 | plf::_::from_triple<float>(0x1.a01a02p-16f, -0x1.7f9f04p-42f, -0x1.36ep-72f), | |
| 51 | 122 | plf::_::from_triple<float>(-0x1.27e4fcp-22f, +0x1.150d44p-47f, +0x1.b0d88p-72f), | |
| 52 | 122 | plf::_::from_triple<float>(0x1.1eed8cp-29f, +0x1.4dd5p-56f, +0x1.19bbp-81f), | |
| 53 | 122 | plf::_::from_triple<float>(-0x1.9392c2p-37f, -0x1.8aab28p-63f, -0x1.7c58p-89f), | |
| 54 | 122 | plf::_::from_triple<float>(0x1.aa972ep-45f, -0x1.9e9332p-70f, -0x1.74e9p-95f)}; | |
| 55 | } | ||
| 56 | else if constexpr (std::same_as<T, double_real_t<double>>) | ||
| 57 | { | ||
| 58 | //using r_t = double_real_t<double>; | ||
| 59 | 214 | return kumi::tuple{plf::_::from_pair<double>(0x1p+0, +0x0p+0), | |
| 60 | 214 | plf::_::from_pair<double>(-0x1p-1, +0x1.18p-102), | |
| 61 | 214 | plf::_::from_pair<double>(0x1.5555555555555p-5, +0x1.5555555548eb4p-59), | |
| 62 | 214 | plf::_::from_pair<double>(-0x1.6c16c16c16c17p-10, +0x1.f49f4a5768168p-65), | |
| 63 | 214 | plf::_::from_pair<double>(0x1.a01a01a01a01ap-16, +0x1.9fe8c4b57e18p-76), | |
| 64 | 214 | plf::_::from_pair<double>(-0x1.27e4fb7789f5cp-22, -0x1.c9f238e0a982dp-76), | |
| 65 | 214 | plf::_::from_pair<double>(0x1.1eed8eff8d896p-29, +0x1.978ac9749f96fp-83), | |
| 66 | 214 | plf::_::from_pair<double>(-0x1.93974a8c07793p-37, +0x1.82ee317825dbp-94), | |
| 67 | 214 | plf::_::from_pair<double>(0x1.ae7f3e726ce4fp-45, -0x1.6d4bb0e413fafp-99), | |
| 68 | 214 | plf::_::from_pair<double>(-0x1.682784de2f11p-53, -0x1.7124a4345b29ep-108), | |
| 69 | 214 | plf::_::from_pair<double>(0x1.e53fccfb5614cp-62, -0x1.daedc787b65f8p-117), | |
| 70 | 214 | plf::_::from_pair<double>(-0x1.0b15f05d82628p-70, +0x1.b38f07d777c42p-125)}; | |
| 71 | } | ||
| 72 | else if constexpr (std::same_as<T, triple_real_t<double>>) | ||
| 73 | { | ||
| 74 | //using r_t = triple_real_t<double>; | ||
| 75 | return kumi::tuple{ | ||
| 76 | 124 | plf::_::from_triple<double>(0x1p+0, +0x0p+0, +0x0p+0), | |
| 77 | 124 | plf::_::from_triple<double>(-0x1p-1, +0x0p+0, +0x0p+0), | |
| 78 | 124 | plf::_::from_triple<double>(0x1.5555555555555p-5, +0x1.5555555555555p-59, +0x1.5555555555474p-113), | |
| 79 | 124 | plf::_::from_triple<double>(-0x1.6c16c16c16c17p-10, +0x1.f49f49f49f49fp-65, +0x1.27d27d29369cep-119), | |
| 80 | 124 | plf::_::from_triple<double>(0x1.a01a01a01a01ap-16, +0x1.a01a01a01a01ap-76, +0x1.9fa8bd5859p-136), | |
| 81 | 124 | plf::_::from_triple<double>(-0x1.27e4fb7789f5cp-22, -0x1.cbbc05b4fa99ap-76, +0x1.c7712d610a62p-132), | |
| 82 | 124 | plf::_::from_triple<double>(0x1.1eed8eff8d898p-29, -0x1.2aec959e14c06p-83, -0x1.97e00071ede88p-138), | |
| 83 | 124 | plf::_::from_triple<double>(-0x1.93974a8c07c9dp-37, -0x1.05d6f8a2ef7e7p-92, +0x1.d326c1a15e4eep-146), | |
| 84 | 124 | plf::_::from_triple<double>(0x1.ae7f3e733b81fp-45, +0x1.1d8656ac84d0dp-101, +0x1.1fd2c1d0996f4p-155), | |
| 85 | 124 | plf::_::from_triple<double>(-0x1.6827863b97d97p-53, -0x1.eec00cb429655p-107, -0x1.4ee20fb1234p-167), | |
| 86 | 124 | plf::_::from_triple<double>(0x1.e542ba4020225p-62, +0x1.e7fb335aedc9bp-120, -0x1.fffab29cc914p-174), | |
| 87 | 124 | plf::_::from_triple<double>(-0x1.0ce396db7f852p-70, -0x1.e690437d35839p-124, +0x1.5c76a791a5431p-178), | |
| 88 | 124 | plf::_::from_triple<double>(0x1.f2cf01972f4a2p-80, +0x1.4ea269f34fe63p-138, -0x1.750170debd68p-192), | |
| 89 | 124 | plf::_::from_triple<double>(-0x1.88e85fc67dc3cp-89, -0x1.17e7f4e4b8ed6p-143, +0x1.486eb1e708244p-199), | |
| 90 | 124 | plf::_::from_triple<double>(0x1.0a18a211f01bdp-98, +0x1.206dbe6558fcp-153, -0x1.4057cbbd0b374p-207), | |
| 91 | 124 | plf::_::from_triple<double>(-0x1.3931e172b6931p-108, -0x1.ae8922f8ac0fp-163, -0x1.6b9f3d518571ap-217), | |
| 92 | 124 | plf::_::from_triple<double>(0x1.41cd7944e8bc1p-118, -0x1.c71cf34af3e2p-177, +0x1.eda8cfeb4e1p-234)}; | |
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | 600 | template<typename T> auto sino_x_coefs() | |
| 97 | { | ||
| 98 | if constexpr (std::is_same_v<T, float>) | ||
| 99 | { | ||
| 100 | return kumi::tuple{T(0x1p+0), T(-0x1.555544p-3f), T(0x1.11073ap-7f), T(-0x1.9943f2p-13f)}; | ||
| 101 | } | ||
| 102 | else if constexpr (std::is_same_v<T, double>) | ||
| 103 | { | ||
| 104 | return kumi::tuple{T(0x1p+0), | ||
| 105 | T(-0x1.5555555555548p-3), | ||
| 106 | T(0x1.111111110f7d0p-7), | ||
| 107 | T(-0x1.a01a019bfdf03p-13), | ||
| 108 | T(0x1.71de3567d4896p-19), | ||
| 109 | T(-0x1.ae5e5a9291691p-26), | ||
| 110 | T(0x1.5d8fd1fcf0ec1p-33)}; | ||
| 111 | } | ||
| 112 | else if constexpr (std::same_as<T, double_real_t<float>>) | ||
| 113 | { | ||
| 114 | //using r_t = double_real_t<float> | ||
| 115 | 140 | return kumi::tuple{plf::_::from_pair<float>(0x1p+0, +0x0p+0), | |
| 116 | 140 | plf::_::from_pair<float>(-0x1.555556p-3, +0x1.555558p-28), | |
| 117 | 140 | plf::_::from_pair<float>(0x1.111112p-7, -0x1.dde238p-32), | |
| 118 | 140 | plf::_::from_pair<float>(-0x1.a01a02p-13, +0x1.93dd88p-39), | |
| 119 | 140 | plf::_::from_pair<float>(0x1.71de34p-19, +0x1.692c54p-44), | |
| 120 | 140 | plf::_::from_pair<float>(-0x1.ae5dep-26, -0x1.d8e3cp-52), | |
| 121 | 140 | plf::_::from_pair<float>(0x1.5d7052p-33, +0x1.74a7ep-61)}; | |
| 122 | } | ||
| 123 | else if constexpr (std::same_as<T, triple_real_t<float>>) | ||
| 124 | { | ||
| 125 | //using r_t = double_real_t<float>; | ||
| 126 | 122 | return kumi::tuple{plf::_::from_triple<float>(0x1p+0, +0x0p+0, +0x0p+0), | |
| 127 | 122 | plf::_::from_triple<float>(-0x1.555556p-3, +0x1.555556p-28, -0x1.555558p-53), | |
| 128 | 122 | plf::_::from_triple<float>(0x1.111112p-7, -0x1.dddddep-32, +0x1.112cp-59), | |
| 129 | 122 | plf::_::from_triple<float>(-0x1.a01a02p-13, +0x1.7f97fap-39, -0x1.334fep-64), | |
| 130 | 122 | plf::_::from_triple<float>(0x1.71de3ap-19, +0x1.55b1fcp-45, +0x1.ac39p-70), | |
| 131 | 122 | plf::_::from_triple<float>(-0x1.ae6456p-26, -0x1.fdb8d4p-52, +0x1.28c7p-78), | |
| 132 | 122 | plf::_::from_triple<float>(0x1.612462p-33, -0x1.489358p-58, +0x1.0ae3p-85), | |
| 133 | 122 | plf::_::from_triple<float>(-0x1.ae7f7p-41, -0x1.abd16ep-68, -0x1.415fcp-94), | |
| 134 | 122 | plf::_::from_triple<float>(0x1.95546cp-49, -0x1.a12e54p-74, +0x1.1da4p-103), | |
| 135 | 122 | plf::_::from_triple<float>(-0x1.3beacep-57, +0x1.2c0736p-82, +0x1.d2aea8p-107)}; | |
| 136 | } | ||
| 137 | else if constexpr (std::same_as<T, double_real_t<double>>) | ||
| 138 | { | ||
| 139 | 214 | return kumi::tuple{plf::_::from_pair<double>(0x1p+0, +0x0p+0), | |
| 140 | 214 | plf::_::from_pair<double>(-0x1.5555555555555p-3, -0x1.5555555555555p-57), | |
| 141 | 214 | plf::_::from_pair<double>(0x1.1111111111111p-7, +0x1.1111111110b28p-63), | |
| 142 | 214 | plf::_::from_pair<double>(-0x1.a01a01a01a01ap-13, -0x1.a01a017855fcp-73), | |
| 143 | 214 | plf::_::from_pair<double>(0x1.71de3a556c734p-19, -0x1.c154fb0f012e5p-73), | |
| 144 | 214 | plf::_::from_pair<double>(-0x1.ae64567f544e4p-26, +0x1.c06c29a3555bcp-80), | |
| 145 | 214 | plf::_::from_pair<double>(0x1.6124613a86d09p-33, +0x1.d93f6f54fe66cp-87), | |
| 146 | 214 | plf::_::from_pair<double>(-0x1.ae7f3e733b808p-41, -0x1.4c0dfcb7beee8p-97), | |
| 147 | 214 | plf::_::from_pair<double>(0x1.952c7703074efp-49, +0x1.800a8d6fc3118p-105), | |
| 148 | 214 | plf::_::from_pair<double>(-0x1.2f49b4624f386p-57, +0x1.107bdd978ff7cp-113), | |
| 149 | 214 | plf::_::from_pair<double>(0x1.71b8e345c53b4p-66, -0x1.62182f0e94a3p-123), | |
| 150 | 214 | plf::_::from_pair<double>(-0x1.760c2a005ccbep-75, +0x1.f000c1aff4a2ep-129), | |
| 151 | 214 | plf::_::from_pair<double>(0x1.365f1b4976ce5p-84, -0x1.0292b83c87daep-138)}; | |
| 152 | } | ||
| 153 | else if constexpr (std::same_as<T, triple_real_t<double>>) | ||
| 154 | { | ||
| 155 | //using r_t = double_real_t<double>; | ||
| 156 | return kumi::tuple{ | ||
| 157 | 124 | plf::_::from_triple<double>(0x1p+0, +0x0p+0, +0x0p+0), | |
| 158 | 124 | plf::_::from_triple<double>(-0x1.5555555555555p-3, -0x1.5555555555555p-57, -0x1.5555555555555p-111), | |
| 159 | 124 | plf::_::from_triple<double>(0x1.1111111111111p-7, +0x1.1111111111111p-63, +0x1.111111110e62p-119), | |
| 160 | 124 | plf::_::from_triple<double>(-0x1.a01a01a01a01ap-13, -0x1.a01a01a01a01ap-73, -0x1.a019e05fd4p-133), | |
| 161 | 124 | plf::_::from_triple<double>(0x1.71de3a556c734p-19, -0x1.c154f8ddc6cp-73, +0x1.71de2c8b111d6p-127), | |
| 162 | 124 | plf::_::from_triple<double>(-0x1.ae64567f544e4p-26, +0x1.c062e06d1f209p-80, -0x1.c5c35ae4e386cp-136), | |
| 163 | 124 | plf::_::from_triple<double>(0x1.6124613a86d09p-33, +0x1.f28e0cc748ebdp-87, +0x1.698c02ecfb12p-145), | |
| 164 | 124 | plf::_::from_triple<double>(-0x1.ae7f3e733b81fp-41, -0x1.1d8656b0ed5fap-97, +0x1.332f46ff869ep-152), | |
| 165 | 124 | plf::_::from_triple<double>(0x1.952c77030ad4ap-49, +0x1.ac9814643646cp-103, -0x1.672ff9149e1e4p-157), | |
| 166 | 124 | plf::_::from_triple<double>(-0x1.2f49b46814157p-57, -0x1.2650e850a9639p-112, -0x1.87d4dcc7949f8p-167), | |
| 167 | 124 | plf::_::from_triple<double>(0x1.71b8ef6dcf572p-66, -0x1.d06ed193305d2p-120, +0x1.c8a6569527851p-174), | |
| 168 | 124 | plf::_::from_triple<double>(-0x1.761b41316381ap-75, +0x1.64ae3e5cd8493p-129, -0x1.e07ede3a3bb48p-184), | |
| 169 | 124 | plf::_::from_triple<double>(0x1.3f3ccdd165ef7p-84, +0x1.8e705b5f4306bp-140, -0x1.6170961bf218p-198), | |
| 170 | 124 | plf::_::from_triple<double>(-0x1.d1ab1c2d9396ap-94, +0x1.0fb92a3020019p-149, +0x1.79c7336af0a5ap-203), | |
| 171 | 124 | plf::_::from_triple<double>(0x1.259f984ab1657p-103, +0x1.115b541983fe8p-157, -0x1.b6ec9fca0d8bap-211), | |
| 172 | 124 | plf::_::from_triple<double>(-0x1.434c28656c9d2p-113, +0x1.04f1739868a88p-170, +0x1.70d3ba901a7ep-224), | |
| 173 | 124 | plf::_::from_triple<double>(0x1.37f7bad17451dp-123, +0x1.682a8cc6ac10dp-177, -0x1.6fe5ff9fe424ep-232)}; | |
| 174 | } | ||
| 175 | } | ||
| 176 | } | ||
| 177 |