1//===-- Common constants for math functions ---------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_COMMON_CONSTANTS_H
10#define LLVM_LIBC_SRC___SUPPORT_MATH_COMMON_CONSTANTS_H
11
12#include "src/__support/macros/config.h"
13#include "src/__support/number_pair.h"
14
15namespace LIBC_NAMESPACE_DECL {
16
17namespace common_constants_internal {
18
19// log(2) generated by Sollya with:
20// > a = 2^-43 * nearestint(2^43*log(2));
21// LSB = 2^-43 is chosen so that e_x * LOG_2_HI is exact for -1075 < e_x < 1024.
22LIBC_INLINE_VAR constexpr double LOG_2_HI = 0x1.62e42fefa38p-1; // LSB = 2^-43
23// > b = round(log10(2) - a, D, RN);
24LIBC_INLINE_VAR constexpr double LOG_2_LO = 0x1.ef35793c7673p-45; // LSB = 2^-97
25
26// Minimax polynomial for (log(1 + x) - x)/x^2, generated by sollya with:
27// > P = fpminimax((log(1 + x) - x)/x^2, 5, [|D...|], [-2^-8, 2^-7]);
28LIBC_INLINE_VAR constexpr double LOG_COEFFS[6] = {
29 -0x1.fffffffffffffp-2, 0x1.5555555554a9bp-2, -0x1.0000000094567p-2,
30 0x1.99999dcc9823cp-3, -0x1.55550ac2e537ap-3, 0x1.21a02c4e624d7p-3};
31
32// Range reduction constants for logarithms.
33// r(0) = 1, r(127) = 0.5
34// r(k) = 2^-8 * ceil(2^8 * (1 - 2^-8) / (1 + k*2^-7))
35// The constants are chosen so that v = fma(r, m_x, -1) is exact in single
36// precision, and -2^-8 <= v < 2^-7.
37// TODO(lntue): Add reference to how the constants are derived after the
38// resulting paper is ready.
39alignas(8) LIBC_INLINE_VAR constexpr float R[128] = {
40 0x1p0, 0x1.fcp-1, 0x1.f8p-1, 0x1.f4p-1, 0x1.fp-1, 0x1.ecp-1, 0x1.e8p-1,
41 0x1.e4p-1, 0x1.ep-1, 0x1.dep-1, 0x1.dap-1, 0x1.d6p-1, 0x1.d4p-1, 0x1.dp-1,
42 0x1.ccp-1, 0x1.cap-1, 0x1.c6p-1, 0x1.c4p-1, 0x1.cp-1, 0x1.bep-1, 0x1.bap-1,
43 0x1.b8p-1, 0x1.b4p-1, 0x1.b2p-1, 0x1.aep-1, 0x1.acp-1, 0x1.a8p-1, 0x1.a6p-1,
44 0x1.a4p-1, 0x1.ap-1, 0x1.9ep-1, 0x1.9cp-1, 0x1.98p-1, 0x1.96p-1, 0x1.94p-1,
45 0x1.92p-1, 0x1.9p-1, 0x1.8cp-1, 0x1.8ap-1, 0x1.88p-1, 0x1.86p-1, 0x1.84p-1,
46 0x1.8p-1, 0x1.7ep-1, 0x1.7cp-1, 0x1.7ap-1, 0x1.78p-1, 0x1.76p-1, 0x1.74p-1,
47 0x1.72p-1, 0x1.7p-1, 0x1.6ep-1, 0x1.6cp-1, 0x1.6ap-1, 0x1.68p-1, 0x1.66p-1,
48 0x1.64p-1, 0x1.62p-1, 0x1.6p-1, 0x1.5ep-1, 0x1.5cp-1, 0x1.5ap-1, 0x1.58p-1,
49 0x1.56p-1, 0x1.54p-1, 0x1.54p-1, 0x1.52p-1, 0x1.5p-1, 0x1.4ep-1, 0x1.4cp-1,
50 0x1.4ap-1, 0x1.4ap-1, 0x1.48p-1, 0x1.46p-1, 0x1.44p-1, 0x1.42p-1, 0x1.4p-1,
51 0x1.4p-1, 0x1.3ep-1, 0x1.3cp-1, 0x1.3ap-1, 0x1.3ap-1, 0x1.38p-1, 0x1.36p-1,
52 0x1.34p-1, 0x1.34p-1, 0x1.32p-1, 0x1.3p-1, 0x1.3p-1, 0x1.2ep-1, 0x1.2cp-1,
53 0x1.2cp-1, 0x1.2ap-1, 0x1.28p-1, 0x1.28p-1, 0x1.26p-1, 0x1.24p-1, 0x1.24p-1,
54 0x1.22p-1, 0x1.2p-1, 0x1.2p-1, 0x1.1ep-1, 0x1.1cp-1, 0x1.1cp-1, 0x1.1ap-1,
55 0x1.1ap-1, 0x1.18p-1, 0x1.16p-1, 0x1.16p-1, 0x1.14p-1, 0x1.14p-1, 0x1.12p-1,
56 0x1.1p-1, 0x1.1p-1, 0x1.0ep-1, 0x1.0ep-1, 0x1.0cp-1, 0x1.0cp-1, 0x1.0ap-1,
57 0x1.0ap-1, 0x1.08p-1, 0x1.08p-1, 0x1.06p-1, 0x1.06p-1, 0x1.04p-1, 0x1.04p-1,
58 0x1.02p-1, 0x1.0p-1};
59
60LIBC_INLINE_VAR constexpr double RD[128] = {
61 0x1p0, 0x1.fcp-1, 0x1.f8p-1, 0x1.f4p-1, 0x1.fp-1, 0x1.ecp-1, 0x1.e8p-1,
62 0x1.e4p-1, 0x1.ep-1, 0x1.dep-1, 0x1.dap-1, 0x1.d6p-1, 0x1.d4p-1, 0x1.dp-1,
63 0x1.ccp-1, 0x1.cap-1, 0x1.c6p-1, 0x1.c4p-1, 0x1.cp-1, 0x1.bep-1, 0x1.bap-1,
64 0x1.b8p-1, 0x1.b4p-1, 0x1.b2p-1, 0x1.aep-1, 0x1.acp-1, 0x1.a8p-1, 0x1.a6p-1,
65 0x1.a4p-1, 0x1.ap-1, 0x1.9ep-1, 0x1.9cp-1, 0x1.98p-1, 0x1.96p-1, 0x1.94p-1,
66 0x1.92p-1, 0x1.9p-1, 0x1.8cp-1, 0x1.8ap-1, 0x1.88p-1, 0x1.86p-1, 0x1.84p-1,
67 0x1.8p-1, 0x1.7ep-1, 0x1.7cp-1, 0x1.7ap-1, 0x1.78p-1, 0x1.76p-1, 0x1.74p-1,
68 0x1.72p-1, 0x1.7p-1, 0x1.6ep-1, 0x1.6cp-1, 0x1.6ap-1, 0x1.68p-1, 0x1.66p-1,
69 0x1.64p-1, 0x1.62p-1, 0x1.6p-1, 0x1.5ep-1, 0x1.5cp-1, 0x1.5ap-1, 0x1.58p-1,
70 0x1.56p-1, 0x1.54p-1, 0x1.54p-1, 0x1.52p-1, 0x1.5p-1, 0x1.4ep-1, 0x1.4cp-1,
71 0x1.4ap-1, 0x1.4ap-1, 0x1.48p-1, 0x1.46p-1, 0x1.44p-1, 0x1.42p-1, 0x1.4p-1,
72 0x1.4p-1, 0x1.3ep-1, 0x1.3cp-1, 0x1.3ap-1, 0x1.3ap-1, 0x1.38p-1, 0x1.36p-1,
73 0x1.34p-1, 0x1.34p-1, 0x1.32p-1, 0x1.3p-1, 0x1.3p-1, 0x1.2ep-1, 0x1.2cp-1,
74 0x1.2cp-1, 0x1.2ap-1, 0x1.28p-1, 0x1.28p-1, 0x1.26p-1, 0x1.24p-1, 0x1.24p-1,
75 0x1.22p-1, 0x1.2p-1, 0x1.2p-1, 0x1.1ep-1, 0x1.1cp-1, 0x1.1cp-1, 0x1.1ap-1,
76 0x1.1ap-1, 0x1.18p-1, 0x1.16p-1, 0x1.16p-1, 0x1.14p-1, 0x1.14p-1, 0x1.12p-1,
77 0x1.1p-1, 0x1.1p-1, 0x1.0ep-1, 0x1.0ep-1, 0x1.0cp-1, 0x1.0cp-1, 0x1.0ap-1,
78 0x1.0ap-1, 0x1.08p-1, 0x1.08p-1, 0x1.06p-1, 0x1.06p-1, 0x1.04p-1, 0x1.04p-1,
79 0x1.02p-1, 0x1.0p-1};
80
81// Compensated constants for exact logarithm range reduction when FMA is not
82// available.
83// Generated by Sollya with the formula: CD[i] = RD[i]*(1 + i*2^-7) - 1
84// for RD[i] defined on the table above.
85LIBC_INLINE_VAR constexpr double CD[128] = {
86 0.0, -0x1p-14, -0x1p-12, -0x1.2p-11, -0x1p-10, -0x1.9p-10,
87 -0x1.2p-9, -0x1.88p-9, -0x1p-8, -0x1.9p-11, -0x1.fp-10, -0x1.9cp-9,
88 -0x1p-12, -0x1.cp-10, -0x1.bp-9, -0x1.5p-11, -0x1.4p-9, 0x1p-14,
89 -0x1p-9, 0x1.ap-12, -0x1.ep-10, 0x1.8p-12, -0x1.1p-9, -0x1p-15,
90 -0x1.6p-9, -0x1.ap-11, -0x1.ep-9, -0x1.f8p-10, -0x1p-12, -0x1.cp-9,
91 -0x1.fp-10, -0x1.cp-12, -0x1p-8, -0x1.54p-9, -0x1.6p-10, -0x1.4p-13,
92 0x1p-10, -0x1.88p-9, -0x1.08p-9, -0x1.2p-10, -0x1p-12, 0x1.2p-11,
93 -0x1p-8, -0x1.acp-9, -0x1.6p-9, -0x1.1cp-9, -0x1.cp-10, -0x1.58p-10,
94 -0x1p-10, -0x1.7p-11, -0x1p-11, -0x1.6p-12, -0x1p-12, -0x1.cp-13,
95 -0x1p-12, -0x1.6p-12, -0x1p-11, -0x1.7p-11, -0x1p-10, -0x1.58p-10,
96 -0x1.cp-10, -0x1.1cp-9, -0x1.6p-9, -0x1.acp-9, -0x1p-8, 0x1.5p-10,
97 0x1.2p-11, -0x1p-12, -0x1.2p-10, -0x1.08p-9, -0x1.88p-9, 0x1.0cp-9,
98 0x1p-10, -0x1.4p-13, -0x1.6p-10, -0x1.54p-9, -0x1p-8, 0x1p-10,
99 -0x1.cp-12, -0x1.fp-10, -0x1.cp-9, 0x1.68p-10, -0x1p-12, -0x1.f8p-10,
100 -0x1.ep-9, 0x1.1p-10, -0x1.ap-11, -0x1.6p-9, 0x1p-9, -0x1p-15,
101 -0x1.1p-9, 0x1.48p-9, 0x1.8p-12, -0x1.ep-10, 0x1.6p-9, 0x1.ap-12,
102 -0x1p-9, 0x1.48p-9, 0x1p-14, -0x1.4p-9, 0x1p-9, -0x1.5p-11,
103 -0x1.bp-9, 0x1.1p-10, -0x1.cp-10, 0x1.54p-9, -0x1p-12, -0x1.9cp-9,
104 0x1.2p-10, -0x1.fp-10, 0x1.3p-9, -0x1.9p-11, -0x1p-8, 0x1p-12,
105 -0x1.88p-9, 0x1.28p-10, -0x1.2p-9, 0x1.fp-10, -0x1.9p-10, 0x1.4cp-9,
106 -0x1p-10, 0x1.9p-9, -0x1.2p-11, 0x1.c4p-9, -0x1p-12, 0x1.e8p-9,
107 -0x1p-14, -0x1p-8,
108};
109
110LIBC_INLINE_VAR constexpr double LOG_R[128] = {
111 0x0.0000000000000p0, 0x1.010157588de71p-7, 0x1.0205658935847p-6,
112 0x1.8492528c8cabfp-6, 0x1.0415d89e74444p-5, 0x1.466aed42de3eap-5,
113 0x1.894aa149fb343p-5, 0x1.ccb73cdddb2ccp-5, 0x1.08598b59e3a07p-4,
114 0x1.1973bd1465567p-4, 0x1.3bdf5a7d1ee64p-4, 0x1.5e95a4d9791cbp-4,
115 0x1.700d30aeac0e1p-4, 0x1.9335e5d594989p-4, 0x1.b6ac88dad5b1cp-4,
116 0x1.c885801bc4b23p-4, 0x1.ec739830a112p-4, 0x1.fe89139dbd566p-4,
117 0x1.1178e8227e47cp-3, 0x1.1aa2b7e23f72ap-3, 0x1.2d1610c86813ap-3,
118 0x1.365fcb0159016p-3, 0x1.4913d8333b561p-3, 0x1.527e5e4a1b58dp-3,
119 0x1.6574ebe8c133ap-3, 0x1.6f0128b756abcp-3, 0x1.823c16551a3c2p-3,
120 0x1.8beafeb38fe8cp-3, 0x1.95a5adcf7017fp-3, 0x1.a93ed3c8ad9e3p-3,
121 0x1.b31d8575bce3dp-3, 0x1.bd087383bd8adp-3, 0x1.d1037f2655e7bp-3,
122 0x1.db13db0d4894p-3, 0x1.e530effe71012p-3, 0x1.ef5ade4dcffe6p-3,
123 0x1.f991c6cb3b379p-3, 0x1.07138604d5862p-2, 0x1.0c42d676162e3p-2,
124 0x1.1178e8227e47cp-2, 0x1.16b5ccbacfb73p-2, 0x1.1bf99635a6b95p-2,
125 0x1.269621134db92p-2, 0x1.2bef07cdc9354p-2, 0x1.314f1e1d35ce4p-2,
126 0x1.36b6776be1117p-2, 0x1.3c25277333184p-2, 0x1.419b423d5e8c7p-2,
127 0x1.4718dc271c41bp-2, 0x1.4c9e09e172c3cp-2, 0x1.522ae0738a3d8p-2,
128 0x1.57bf753c8d1fbp-2, 0x1.5d5bddf595f3p-2, 0x1.630030b3aac49p-2,
129 0x1.68ac83e9c6a14p-2, 0x1.6e60ee6af1972p-2, 0x1.741d876c67bb1p-2,
130 0x1.79e26687cfb3ep-2, 0x1.7fafa3bd8151cp-2, 0x1.85855776dcbfbp-2,
131 0x1.8b639a88b2df5p-2, 0x1.914a8635bf68ap-2, 0x1.973a3431356aep-2,
132 0x1.9d32bea15ed3bp-2, 0x1.a33440224fa79p-2, 0x1.a33440224fa79p-2,
133 0x1.a93ed3c8ad9e3p-2, 0x1.af5295248cddp-2, 0x1.b56fa04462909p-2,
134 0x1.bb9611b80e2fbp-2, 0x1.c1c60693fa39ep-2, 0x1.c1c60693fa39ep-2,
135 0x1.c7ff9c74554c9p-2, 0x1.ce42f18064743p-2, 0x1.d490246defa6bp-2,
136 0x1.dae75484c9616p-2, 0x1.e148a1a2726cep-2, 0x1.e148a1a2726cep-2,
137 0x1.e7b42c3ddad73p-2, 0x1.ee2a156b413e5p-2, 0x1.f4aa7ee03192dp-2,
138 0x1.f4aa7ee03192dp-2, 0x1.fb358af7a4884p-2, 0x1.00e5ae5b207abp-1,
139 0x1.04360be7603adp-1, 0x1.04360be7603adp-1, 0x1.078bf0533c568p-1,
140 0x1.0ae76e2d054fap-1, 0x1.0ae76e2d054fap-1, 0x1.0e4898611cce1p-1,
141 0x1.11af823c75aa8p-1, 0x1.11af823c75aa8p-1, 0x1.151c3f6f29612p-1,
142 0x1.188ee40f23ca6p-1, 0x1.188ee40f23ca6p-1, 0x1.1c07849ae6007p-1,
143 0x1.1f8635fc61659p-1, 0x1.1f8635fc61659p-1, 0x1.230b0d8bebc98p-1,
144 0x1.269621134db92p-1, 0x1.269621134db92p-1, 0x1.2a2786d0ec107p-1,
145 0x1.2dbf557b0df43p-1, 0x1.2dbf557b0df43p-1, 0x1.315da4434068bp-1,
146 0x1.315da4434068bp-1, 0x1.35028ad9d8c86p-1, 0x1.38ae2171976e7p-1,
147 0x1.38ae2171976e7p-1, 0x1.3c6080c36bfb5p-1, 0x1.3c6080c36bfb5p-1,
148 0x1.4019c2125ca93p-1, 0x1.43d9ff2f923c5p-1, 0x1.43d9ff2f923c5p-1,
149 0x1.47a1527e8a2d3p-1, 0x1.47a1527e8a2d3p-1, 0x1.4b6fd6f970c1fp-1,
150 0x1.4b6fd6f970c1fp-1, 0x1.4f45a835a4e19p-1, 0x1.4f45a835a4e19p-1,
151 0x1.5322e26867857p-1, 0x1.5322e26867857p-1, 0x1.5707a26bb8c66p-1,
152 0x1.5707a26bb8c66p-1, 0x1.5af405c3649ep-1, 0x1.5af405c3649ep-1,
153 0x1.5ee82aa24192p-1, 0x0.000000000000p0};
154
155LIBC_INLINE_VAR constexpr double LOG2_R[128] = {
156 0x0.0000000000000p+0, 0x1.72c7ba20f7327p-7, 0x1.743ee861f3556p-6,
157 0x1.184b8e4c56af8p-5, 0x1.77394c9d958d5p-5, 0x1.d6ebd1f1febfep-5,
158 0x1.1bb32a600549dp-4, 0x1.4c560fe68af88p-4, 0x1.7d60496cfbb4cp-4,
159 0x1.960caf9abb7cap-4, 0x1.c7b528b70f1c5p-4, 0x1.f9c95dc1d1165p-4,
160 0x1.097e38ce60649p-3, 0x1.22dadc2ab3497p-3, 0x1.3c6fb650cde51p-3,
161 0x1.494f863b8df35p-3, 0x1.633a8bf437ce1p-3, 0x1.7046031c79f85p-3,
162 0x1.8a8980abfbd32p-3, 0x1.97c1cb13c7ec1p-3, 0x1.b2602497d5346p-3,
163 0x1.bfc67a7fff4ccp-3, 0x1.dac22d3e441d3p-3, 0x1.e857d3d361368p-3,
164 0x1.01d9bbcfa61d4p-2, 0x1.08bce0d95fa38p-2, 0x1.169c05363f158p-2,
165 0x1.1d982c9d52708p-2, 0x1.249cd2b13cd6cp-2, 0x1.32bfee370ee68p-2,
166 0x1.39de8e1559f6fp-2, 0x1.4106017c3eca3p-2, 0x1.4f6fbb2cec598p-2,
167 0x1.56b22e6b578e5p-2, 0x1.5dfdcf1eeae0ep-2, 0x1.6552b49986277p-2,
168 0x1.6cb0f6865c8eap-2, 0x1.7b89f02cf2aadp-2, 0x1.8304d90c11fd3p-2,
169 0x1.8a8980abfbd32p-2, 0x1.921800924dd3bp-2, 0x1.99b072a96c6b2p-2,
170 0x1.a8ff971810a5ep-2, 0x1.b0b67f4f4681p-2, 0x1.b877c57b1b07p-2,
171 0x1.c043859e2fdb3p-2, 0x1.c819dc2d45fe4p-2, 0x1.cffae611ad12bp-2,
172 0x1.d7e6c0abc3579p-2, 0x1.dfdd89d586e2bp-2, 0x1.e7df5fe538ab3p-2,
173 0x1.efec61b011f85p-2, 0x1.f804ae8d0cd02p-2, 0x1.0014332be0033p-1,
174 0x1.042bd4b9a7c99p-1, 0x1.08494c66b8efp-1, 0x1.0c6caaf0c5597p-1,
175 0x1.1096015dee4dap-1, 0x1.14c560fe68af9p-1, 0x1.18fadb6e2d3c2p-1,
176 0x1.1d368296b5255p-1, 0x1.217868b0c37e8p-1, 0x1.25c0a0463bebp-1,
177 0x1.2a0f3c340705cp-1, 0x1.2e644fac04fd8p-1, 0x1.2e644fac04fd8p-1,
178 0x1.32bfee370ee68p-1, 0x1.37222bb70747cp-1, 0x1.3b8b1c68fa6edp-1,
179 0x1.3ffad4e74f1d6p-1, 0x1.44716a2c08262p-1, 0x1.44716a2c08262p-1,
180 0x1.48eef19317991p-1, 0x1.4d7380dcc422dp-1, 0x1.51ff2e30214bcp-1,
181 0x1.5692101d9b4a6p-1, 0x1.5b2c3da19723bp-1, 0x1.5b2c3da19723bp-1,
182 0x1.5fcdce2727ddbp-1, 0x1.6476d98ad990ap-1, 0x1.6927781d932a8p-1,
183 0x1.6927781d932a8p-1, 0x1.6ddfc2a78fc63p-1, 0x1.729fd26b707c8p-1,
184 0x1.7767c12967a45p-1, 0x1.7767c12967a45p-1, 0x1.7c37a9227e7fbp-1,
185 0x1.810fa51bf65fdp-1, 0x1.810fa51bf65fdp-1, 0x1.85efd062c656dp-1,
186 0x1.8ad846cf369a4p-1, 0x1.8ad846cf369a4p-1, 0x1.8fc924c89ac84p-1,
187 0x1.94c287492c4dbp-1, 0x1.94c287492c4dbp-1, 0x1.99c48be2063c8p-1,
188 0x1.9ecf50bf43f13p-1, 0x1.9ecf50bf43f13p-1, 0x1.a3e2f4ac43f6p-1,
189 0x1.a8ff971810a5ep-1, 0x1.a8ff971810a5ep-1, 0x1.ae255819f022dp-1,
190 0x1.b35458761d479p-1, 0x1.b35458761d479p-1, 0x1.b88cb9a2ab521p-1,
191 0x1.b88cb9a2ab521p-1, 0x1.bdce9dcc96187p-1, 0x1.c31a27dd00b4ap-1,
192 0x1.c31a27dd00b4ap-1, 0x1.c86f7b7ea4a89p-1, 0x1.c86f7b7ea4a89p-1,
193 0x1.cdcebd2373995p-1, 0x1.d338120a6dd9dp-1, 0x1.d338120a6dd9dp-1,
194 0x1.d8aba045b01c8p-1, 0x1.d8aba045b01c8p-1, 0x1.de298ec0bac0dp-1,
195 0x1.de298ec0bac0dp-1, 0x1.e3b20546f554ap-1, 0x1.e3b20546f554ap-1,
196 0x1.e9452c8a71028p-1, 0x1.e9452c8a71028p-1, 0x1.eee32e2aeccbfp-1,
197 0x1.eee32e2aeccbfp-1, 0x1.f48c34bd1e96fp-1, 0x1.f48c34bd1e96fp-1,
198 0x1.fa406bd2443dfp-1, 0x1.0000000000000p0};
199
200// Generated by Sollya with:
201// for i from 0 to 127 do {
202// r = 2^-8 * ceil( 2^8 * (1 - 2^(-8)) / (1 + i*2^-7) );
203// b = nearestint(log(r)*2^43) * 2^-43;
204// c = round(log(r) - b, D, RN);
205// print("{", -c, ",", -b, "},");
206// };
207// We replace LOG_R[0] with log10(1.0) == 0.0
208alignas(16) LIBC_INLINE_VAR constexpr NumberPair<double> LOG_R_DD[128] = {
209 {.lo: 0.0, .hi: 0.0},
210 {.lo: -0x1.0c76b999d2be8p-46, .hi: 0x1.010157589p-7},
211 {.lo: -0x1.3dc5b06e2f7d2p-45, .hi: 0x1.0205658938p-6},
212 {.lo: -0x1.aa0ba325a0c34p-45, .hi: 0x1.8492528c9p-6},
213 {.lo: 0x1.111c05cf1d753p-47, .hi: 0x1.0415d89e74p-5},
214 {.lo: -0x1.c167375bdfd28p-45, .hi: 0x1.466aed42ep-5},
215 {.lo: -0x1.97995d05a267dp-46, .hi: 0x1.894aa149fcp-5},
216 {.lo: -0x1.a68f247d82807p-46, .hi: 0x1.ccb73cdddcp-5},
217 {.lo: -0x1.7e5dd7009902cp-46, .hi: 0x1.08598b59e4p-4},
218 {.lo: -0x1.5325d560d9e9bp-45, .hi: 0x1.1973bd1466p-4},
219 {.lo: 0x1.cc85ea5db4ed7p-45, .hi: 0x1.3bdf5a7d1ep-4},
220 {.lo: -0x1.c69063c5d1d1ep-45, .hi: 0x1.5e95a4d97ap-4},
221 {.lo: 0x1.c1e8da99ded32p-49, .hi: 0x1.700d30aeacp-4},
222 {.lo: 0x1.3115c3abd47dap-45, .hi: 0x1.9335e5d594p-4},
223 {.lo: -0x1.390802bf768e5p-46, .hi: 0x1.b6ac88dad6p-4},
224 {.lo: 0x1.646d1c65aacd3p-45, .hi: 0x1.c885801bc4p-4},
225 {.lo: -0x1.dc068afe645ep-45, .hi: 0x1.ec739830a2p-4},
226 {.lo: -0x1.534d64fa10afdp-45, .hi: 0x1.fe89139dbep-4},
227 {.lo: 0x1.1ef78ce2d07f2p-45, .hi: 0x1.1178e8227ep-3},
228 {.lo: 0x1.ca78e44389934p-45, .hi: 0x1.1aa2b7e23fp-3},
229 {.lo: 0x1.39d6ccb81b4a1p-47, .hi: 0x1.2d1610c868p-3},
230 {.lo: 0x1.62fa8234b7289p-51, .hi: 0x1.365fcb0159p-3},
231 {.lo: 0x1.5837954fdb678p-45, .hi: 0x1.4913d8333bp-3},
232 {.lo: 0x1.633e8e5697dc7p-45, .hi: 0x1.527e5e4a1bp-3},
233 {.lo: 0x1.9cf8b2c3c2e78p-46, .hi: 0x1.6574ebe8c1p-3},
234 {.lo: -0x1.5118de59c21e1p-45, .hi: 0x1.6f0128b757p-3},
235 {.lo: 0x1.e0ddb9a631e83p-46, .hi: 0x1.823c16551ap-3},
236 {.lo: -0x1.73d54aae92cd1p-47, .hi: 0x1.8beafeb39p-3},
237 {.lo: 0x1.7f22858a0ff6fp-47, .hi: 0x1.95a5adcf7p-3},
238 {.lo: -0x1.8724350562169p-45, .hi: 0x1.a93ed3c8aep-3},
239 {.lo: -0x1.c358d4eace1aap-47, .hi: 0x1.b31d8575bdp-3},
240 {.lo: -0x1.d4bc4595412b6p-45, .hi: 0x1.bd087383bep-3},
241 {.lo: -0x1.84a7e75b6f6e4p-47, .hi: 0x1.d1037f2656p-3},
242 {.lo: -0x1.aff2af715b035p-45, .hi: 0x1.db13db0d49p-3},
243 {.lo: 0x1.212276041f43p-51, .hi: 0x1.e530effe71p-3},
244 {.lo: -0x1.a211565bb8e11p-51, .hi: 0x1.ef5ade4ddp-3},
245 {.lo: 0x1.bcbecca0cdf3p-46, .hi: 0x1.f991c6cb3bp-3},
246 {.lo: 0x1.89cdb16ed4e91p-48, .hi: 0x1.07138604d58p-2},
247 {.lo: 0x1.7188b163ceae9p-45, .hi: 0x1.0c42d67616p-2},
248 {.lo: -0x1.c210e63a5f01cp-45, .hi: 0x1.1178e8227e8p-2},
249 {.lo: 0x1.b9acdf7a51681p-45, .hi: 0x1.16b5ccbacf8p-2},
250 {.lo: 0x1.ca6ed5147bdb7p-45, .hi: 0x1.1bf99635a68p-2},
251 {.lo: 0x1.c93c1df5bb3b6p-45, .hi: 0x1.269621134d8p-2},
252 {.lo: 0x1.a9cfa4a5004f4p-45, .hi: 0x1.2bef07cdc9p-2},
253 {.lo: -0x1.8e27ad3213cb8p-45, .hi: 0x1.314f1e1d36p-2},
254 {.lo: 0x1.16ecdb0f177c8p-46, .hi: 0x1.36b6776be1p-2},
255 {.lo: 0x1.83b54b606bd5cp-46, .hi: 0x1.3c25277333p-2},
256 {.lo: 0x1.8e436ec90e09dp-47, .hi: 0x1.419b423d5e8p-2},
257 {.lo: -0x1.f27ce0967d675p-45, .hi: 0x1.4718dc271c8p-2},
258 {.lo: -0x1.e20891b0ad8a4p-45, .hi: 0x1.4c9e09e173p-2},
259 {.lo: 0x1.ebe708164c759p-45, .hi: 0x1.522ae0738ap-2},
260 {.lo: 0x1.fadedee5d40efp-46, .hi: 0x1.57bf753c8dp-2},
261 {.lo: -0x1.a0b2a08a465dcp-47, .hi: 0x1.5d5bddf596p-2},
262 {.lo: -0x1.db623e731aep-45, .hi: 0x1.630030b3abp-2},
263 {.lo: 0x1.0a0d32756ebap-45, .hi: 0x1.68ac83e9c68p-2},
264 {.lo: 0x1.721657c222d87p-46, .hi: 0x1.6e60ee6af18p-2},
265 {.lo: 0x1.d8b0949dc60b3p-45, .hi: 0x1.741d876c678p-2},
266 {.lo: 0x1.9ec7d2efd1778p-45, .hi: 0x1.79e26687cf8p-2},
267 {.lo: -0x1.72090c812566ap-45, .hi: 0x1.7fafa3bd818p-2},
268 {.lo: 0x1.fd56f3333778ap-45, .hi: 0x1.85855776dc8p-2},
269 {.lo: -0x1.05ae1e5e7047p-45, .hi: 0x1.8b639a88b3p-2},
270 {.lo: -0x1.766b52ee6307dp-46, .hi: 0x1.914a8635bf8p-2},
271 {.lo: -0x1.52313a502d9fp-46, .hi: 0x1.973a3431358p-2},
272 {.lo: -0x1.6279e10d0c0bp-45, .hi: 0x1.9d32bea15fp-2},
273 {.lo: 0x1.3c6457f9d79f5p-45, .hi: 0x1.a33440224f8p-2},
274 {.lo: 0x1.3c6457f9d79f5p-45, .hi: 0x1.a33440224f8p-2},
275 {.lo: 0x1.e36f2bea77a5dp-46, .hi: 0x1.a93ed3c8ad8p-2},
276 {.lo: -0x1.17cc552774458p-45, .hi: 0x1.af5295248dp-2},
277 {.lo: 0x1.095252d841995p-46, .hi: 0x1.b56fa044628p-2},
278 {.lo: 0x1.7d85bf40a666dp-45, .hi: 0x1.bb9611b80ep-2},
279 {.lo: 0x1.cec807fe8e18p-45, .hi: 0x1.c1c60693fap-2},
280 {.lo: 0x1.cec807fe8e18p-45, .hi: 0x1.c1c60693fap-2},
281 {.lo: -0x1.9b6ddc15249aep-45, .hi: 0x1.c7ff9c74558p-2},
282 {.lo: -0x1.797c33ec7a6bp-47, .hi: 0x1.ce42f180648p-2},
283 {.lo: 0x1.35bafe9a767a8p-45, .hi: 0x1.d490246def8p-2},
284 {.lo: -0x1.ea42d60dc616ap-46, .hi: 0x1.dae75484c98p-2},
285 {.lo: -0x1.326b207322938p-46, .hi: 0x1.e148a1a2728p-2},
286 {.lo: -0x1.326b207322938p-46, .hi: 0x1.e148a1a2728p-2},
287 {.lo: -0x1.465505372bd08p-45, .hi: 0x1.e7b42c3ddbp-2},
288 {.lo: 0x1.f27f45a470251p-45, .hi: 0x1.ee2a156b41p-2},
289 {.lo: 0x1.2cde56f014a8bp-46, .hi: 0x1.f4aa7ee0318p-2},
290 {.lo: 0x1.2cde56f014a8bp-46, .hi: 0x1.f4aa7ee0318p-2},
291 {.lo: 0x1.085fa3c164935p-47, .hi: 0x1.fb358af7a48p-2},
292 {.lo: -0x1.53ba3b1727b1cp-47, .hi: 0x1.00e5ae5b208p-1},
293 {.lo: -0x1.4c45fe79539ep-47, .hi: 0x1.04360be7604p-1},
294 {.lo: -0x1.4c45fe79539ep-47, .hi: 0x1.04360be7604p-1},
295 {.lo: 0x1.6812241edf5fdp-45, .hi: 0x1.078bf0533c4p-1},
296 {.lo: 0x1.f486b887e7e27p-46, .hi: 0x1.0ae76e2d054p-1},
297 {.lo: 0x1.f486b887e7e27p-46, .hi: 0x1.0ae76e2d054p-1},
298 {.lo: 0x1.c299807801742p-46, .hi: 0x1.0e4898611ccp-1},
299 {.lo: -0x1.58647bb9ddcb2p-45, .hi: 0x1.11af823c75cp-1},
300 {.lo: -0x1.58647bb9ddcb2p-45, .hi: 0x1.11af823c75cp-1},
301 {.lo: -0x1.edd97a293ae49p-45, .hi: 0x1.151c3f6f298p-1},
302 {.lo: 0x1.4cc4ef8ab465p-46, .hi: 0x1.188ee40f23cp-1},
303 {.lo: 0x1.4cc4ef8ab465p-46, .hi: 0x1.188ee40f23cp-1},
304 {.lo: 0x1.cacdeed70e667p-51, .hi: 0x1.1c07849ae6p-1},
305 {.lo: -0x1.a7242c9fe81d3p-45, .hi: 0x1.1f8635fc618p-1},
306 {.lo: -0x1.a7242c9fe81d3p-45, .hi: 0x1.1f8635fc618p-1},
307 {.lo: 0x1.2fc066e48667bp-46, .hi: 0x1.230b0d8bebcp-1},
308 {.lo: -0x1.b61f10522625p-47, .hi: 0x1.269621134dcp-1},
309 {.lo: -0x1.b61f10522625p-47, .hi: 0x1.269621134dcp-1},
310 {.lo: 0x1.06d2be797882dp-45, .hi: 0x1.2a2786d0ecp-1},
311 {.lo: -0x1.7a6e507b9dc11p-46, .hi: 0x1.2dbf557b0ep-1},
312 {.lo: -0x1.7a6e507b9dc11p-46, .hi: 0x1.2dbf557b0ep-1},
313 {.lo: -0x1.74e93c5a0ed9cp-45, .hi: 0x1.315da443408p-1},
314 {.lo: -0x1.74e93c5a0ed9cp-45, .hi: 0x1.315da443408p-1},
315 {.lo: 0x1.0b83f9527e6acp-46, .hi: 0x1.35028ad9d8cp-1},
316 {.lo: -0x1.18b7abb5569a4p-45, .hi: 0x1.38ae2171978p-1},
317 {.lo: -0x1.18b7abb5569a4p-45, .hi: 0x1.38ae2171978p-1},
318 {.lo: -0x1.2b7367cfe13c2p-47, .hi: 0x1.3c6080c36cp-1},
319 {.lo: -0x1.2b7367cfe13c2p-47, .hi: 0x1.3c6080c36cp-1},
320 {.lo: -0x1.6ce7930f0c74cp-45, .hi: 0x1.4019c2125ccp-1},
321 {.lo: -0x1.d984f481051f7p-48, .hi: 0x1.43d9ff2f924p-1},
322 {.lo: -0x1.d984f481051f7p-48, .hi: 0x1.43d9ff2f924p-1},
323 {.lo: -0x1.2cb6af94d60aap-45, .hi: 0x1.47a1527e8a4p-1},
324 {.lo: -0x1.2cb6af94d60aap-45, .hi: 0x1.47a1527e8a4p-1},
325 {.lo: 0x1.f7115ed4c541cp-49, .hi: 0x1.4b6fd6f970cp-1},
326 {.lo: 0x1.f7115ed4c541cp-49, .hi: 0x1.4b6fd6f970cp-1},
327 {.lo: -0x1.e6c516d93b8fbp-45, .hi: 0x1.4f45a835a5p-1},
328 {.lo: -0x1.e6c516d93b8fbp-45, .hi: 0x1.4f45a835a5p-1},
329 {.lo: 0x1.5ccc45d257531p-47, .hi: 0x1.5322e268678p-1},
330 {.lo: 0x1.5ccc45d257531p-47, .hi: 0x1.5322e268678p-1},
331 {.lo: 0x1.9980bff3303ddp-47, .hi: 0x1.5707a26bb8cp-1},
332 {.lo: 0x1.9980bff3303ddp-47, .hi: 0x1.5707a26bb8cp-1},
333 {.lo: 0x1.dfa63ac10c9fbp-45, .hi: 0x1.5af405c3648p-1},
334 {.lo: 0x1.dfa63ac10c9fbp-45, .hi: 0x1.5af405c3648p-1},
335 {.lo: 0x1.202380cda46bep-45, .hi: 0x1.5ee82aa2418p-1},
336 {.lo: 0.0, .hi: 0.0},
337};
338
339// Logarithm range reduction - Step 2:
340// r(k) = 2^-16 round(2^16 / (1 + k*2^-14)) for k = -2^6 .. 2^7.
341// Output range:
342// [-0x1.3ffcp-15, 0x1.3e3dp-15]
343// We store S2[i] = 2^16 (r(i - 2^6) - 1).
344alignas(8) LIBC_INLINE_VAR constexpr int S2[193] = {
345 0x101, 0xfd, 0xf9, 0xf5, 0xf1, 0xed, 0xe9, 0xe5, 0xe1,
346 0xdd, 0xd9, 0xd5, 0xd1, 0xcd, 0xc9, 0xc5, 0xc1, 0xbd,
347 0xb9, 0xb4, 0xb0, 0xac, 0xa8, 0xa4, 0xa0, 0x9c, 0x98,
348 0x94, 0x90, 0x8c, 0x88, 0x84, 0x80, 0x7c, 0x78, 0x74,
349 0x70, 0x6c, 0x68, 0x64, 0x60, 0x5c, 0x58, 0x54, 0x50,
350 0x4c, 0x48, 0x44, 0x40, 0x3c, 0x38, 0x34, 0x30, 0x2c,
351 0x28, 0x24, 0x20, 0x1c, 0x18, 0x14, 0x10, 0xc, 0x8,
352 0x4, 0x0, -0x4, -0x8, -0xc, -0x10, -0x14, -0x18, -0x1c,
353 -0x20, -0x24, -0x28, -0x2c, -0x30, -0x34, -0x38, -0x3c, -0x40,
354 -0x44, -0x48, -0x4c, -0x50, -0x54, -0x58, -0x5c, -0x60, -0x64,
355 -0x68, -0x6c, -0x70, -0x74, -0x78, -0x7c, -0x80, -0x84, -0x88,
356 -0x8c, -0x90, -0x94, -0x98, -0x9c, -0xa0, -0xa4, -0xa8, -0xac,
357 -0xb0, -0xb4, -0xb7, -0xbb, -0xbf, -0xc3, -0xc7, -0xcb, -0xcf,
358 -0xd3, -0xd7, -0xdb, -0xdf, -0xe3, -0xe7, -0xeb, -0xef, -0xf3,
359 -0xf7, -0xfb, -0xff, -0x103, -0x107, -0x10b, -0x10f, -0x113, -0x117,
360 -0x11b, -0x11f, -0x123, -0x127, -0x12b, -0x12f, -0x133, -0x137, -0x13a,
361 -0x13e, -0x142, -0x146, -0x14a, -0x14e, -0x152, -0x156, -0x15a, -0x15e,
362 -0x162, -0x166, -0x16a, -0x16e, -0x172, -0x176, -0x17a, -0x17e, -0x182,
363 -0x186, -0x18a, -0x18e, -0x192, -0x195, -0x199, -0x19d, -0x1a1, -0x1a5,
364 -0x1a9, -0x1ad, -0x1b1, -0x1b5, -0x1b9, -0x1bd, -0x1c1, -0x1c5, -0x1c9,
365 -0x1cd, -0x1d1, -0x1d5, -0x1d9, -0x1dd, -0x1e0, -0x1e4, -0x1e8, -0x1ec,
366 -0x1f0, -0x1f4, -0x1f8, -0x1fc};
367
368LIBC_INLINE_VAR constexpr double R2[193] = {
369 0x1.0101p0, 0x1.00fdp0, 0x1.00f9p0, 0x1.00f5p0, 0x1.00f1p0,
370 0x1.00edp0, 0x1.00e9p0, 0x1.00e5p0, 0x1.00e1p0, 0x1.00ddp0,
371 0x1.00d9p0, 0x1.00d5p0, 0x1.00d1p0, 0x1.00cdp0, 0x1.00c9p0,
372 0x1.00c5p0, 0x1.00c1p0, 0x1.00bdp0, 0x1.00b9p0, 0x1.00b4p0,
373 0x1.00bp0, 0x1.00acp0, 0x1.00a8p0, 0x1.00a4p0, 0x1.00ap0,
374 0x1.009cp0, 0x1.0098p0, 0x1.0094p0, 0x1.009p0, 0x1.008cp0,
375 0x1.0088p0, 0x1.0084p0, 0x1.008p0, 0x1.007cp0, 0x1.0078p0,
376 0x1.0074p0, 0x1.007p0, 0x1.006cp0, 0x1.0068p0, 0x1.0064p0,
377 0x1.006p0, 0x1.005cp0, 0x1.0058p0, 0x1.0054p0, 0x1.005p0,
378 0x1.004cp0, 0x1.0048p0, 0x1.0044p0, 0x1.004p0, 0x1.003cp0,
379 0x1.0038p0, 0x1.0034p0, 0x1.003p0, 0x1.002cp0, 0x1.0028p0,
380 0x1.0024p0, 0x1.002p0, 0x1.001cp0, 0x1.0018p0, 0x1.0014p0,
381 0x1.001p0, 0x1.000cp0, 0x1.0008p0, 0x1.0004p0, 0x1p0,
382 0x1.fff8p-1, 0x1.fffp-1, 0x1.ffe8p-1, 0x1.ffep-1, 0x1.ffd8p-1,
383 0x1.ffdp-1, 0x1.ffc8p-1, 0x1.ffcp-1, 0x1.ffb8p-1, 0x1.ffbp-1,
384 0x1.ffa8p-1, 0x1.ffap-1, 0x1.ff98p-1, 0x1.ff9p-1, 0x1.ff88p-1,
385 0x1.ff8p-1, 0x1.ff78p-1, 0x1.ff7p-1, 0x1.ff68p-1, 0x1.ff6p-1,
386 0x1.ff58p-1, 0x1.ff5p-1, 0x1.ff48p-1, 0x1.ff4p-1, 0x1.ff38p-1,
387 0x1.ff3p-1, 0x1.ff28p-1, 0x1.ff2p-1, 0x1.ff18p-1, 0x1.ff1p-1,
388 0x1.ff08p-1, 0x1.ffp-1, 0x1.fef8p-1, 0x1.fefp-1, 0x1.fee8p-1,
389 0x1.feep-1, 0x1.fed8p-1, 0x1.fedp-1, 0x1.fec8p-1, 0x1.fecp-1,
390 0x1.feb8p-1, 0x1.febp-1, 0x1.fea8p-1, 0x1.feap-1, 0x1.fe98p-1,
391 0x1.fe92p-1, 0x1.fe8ap-1, 0x1.fe82p-1, 0x1.fe7ap-1, 0x1.fe72p-1,
392 0x1.fe6ap-1, 0x1.fe62p-1, 0x1.fe5ap-1, 0x1.fe52p-1, 0x1.fe4ap-1,
393 0x1.fe42p-1, 0x1.fe3ap-1, 0x1.fe32p-1, 0x1.fe2ap-1, 0x1.fe22p-1,
394 0x1.fe1ap-1, 0x1.fe12p-1, 0x1.fe0ap-1, 0x1.fe02p-1, 0x1.fdfap-1,
395 0x1.fdf2p-1, 0x1.fdeap-1, 0x1.fde2p-1, 0x1.fddap-1, 0x1.fdd2p-1,
396 0x1.fdcap-1, 0x1.fdc2p-1, 0x1.fdbap-1, 0x1.fdb2p-1, 0x1.fdaap-1,
397 0x1.fda2p-1, 0x1.fd9ap-1, 0x1.fd92p-1, 0x1.fd8cp-1, 0x1.fd84p-1,
398 0x1.fd7cp-1, 0x1.fd74p-1, 0x1.fd6cp-1, 0x1.fd64p-1, 0x1.fd5cp-1,
399 0x1.fd54p-1, 0x1.fd4cp-1, 0x1.fd44p-1, 0x1.fd3cp-1, 0x1.fd34p-1,
400 0x1.fd2cp-1, 0x1.fd24p-1, 0x1.fd1cp-1, 0x1.fd14p-1, 0x1.fd0cp-1,
401 0x1.fd04p-1, 0x1.fcfcp-1, 0x1.fcf4p-1, 0x1.fcecp-1, 0x1.fce4p-1,
402 0x1.fcdcp-1, 0x1.fcd6p-1, 0x1.fccep-1, 0x1.fcc6p-1, 0x1.fcbep-1,
403 0x1.fcb6p-1, 0x1.fcaep-1, 0x1.fca6p-1, 0x1.fc9ep-1, 0x1.fc96p-1,
404 0x1.fc8ep-1, 0x1.fc86p-1, 0x1.fc7ep-1, 0x1.fc76p-1, 0x1.fc6ep-1,
405 0x1.fc66p-1, 0x1.fc5ep-1, 0x1.fc56p-1, 0x1.fc4ep-1, 0x1.fc46p-1,
406 0x1.fc4p-1, 0x1.fc38p-1, 0x1.fc3p-1, 0x1.fc28p-1, 0x1.fc2p-1,
407 0x1.fc18p-1, 0x1.fc1p-1, 0x1.fc08p-1,
408};
409
410// Logarithm range reduction - Step 3:
411// r(k) = 2^-21 round(2^21 / (1 + k*2^-21)) for k = -80 .. 80.
412// Output range:
413// [-0x1.01928p-22 , 0x1p-22]
414// We store S[i] = 2^21 (r(i - 80) - 1).
415alignas(8) LIBC_INLINE_VAR constexpr int S3[161] = {
416 0x50, 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46,
417 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b,
418 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
419 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25,
420 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a,
421 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0xf,
422 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4,
423 0x3, 0x2, 0x1, 0x0, -0x1, -0x2, -0x3, -0x4, -0x5, -0x6, -0x7,
424 -0x8, -0x9, -0xa, -0xb, -0xc, -0xd, -0xe, -0xf, -0x10, -0x11, -0x12,
425 -0x13, -0x14, -0x15, -0x16, -0x17, -0x18, -0x19, -0x1a, -0x1b, -0x1c, -0x1d,
426 -0x1e, -0x1f, -0x20, -0x21, -0x22, -0x23, -0x24, -0x25, -0x26, -0x27, -0x28,
427 -0x29, -0x2a, -0x2b, -0x2c, -0x2d, -0x2e, -0x2f, -0x30, -0x31, -0x32, -0x33,
428 -0x34, -0x35, -0x36, -0x37, -0x38, -0x39, -0x3a, -0x3b, -0x3c, -0x3d, -0x3e,
429 -0x3f, -0x40, -0x41, -0x42, -0x43, -0x44, -0x45, -0x46, -0x47, -0x48, -0x49,
430 -0x4a, -0x4b, -0x4c, -0x4d, -0x4e, -0x4f, -0x50,
431};
432
433// Logarithm range reduction - Step 4
434// r(k) = 2^-28 round(2^28 / (1 + k*2^-28)) for k = -65 .. 64.
435// Output range:
436// [-0x1.0002143p-29 , 0x1p-29]
437// We store S[i] = 2^28 (r(i - 65) - 1).
438alignas(8) LIBC_INLINE_VAR constexpr int S4[130] = {
439 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37,
440 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c,
441 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21,
442 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16,
443 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0xf, 0xe, 0xd, 0xc, 0xb,
444 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0,
445 -0x1, -0x2, -0x3, -0x4, -0x5, -0x6, -0x7, -0x8, -0x9, -0xa, -0xb,
446 -0xc, -0xd, -0xe, -0xf, -0x10, -0x11, -0x12, -0x13, -0x14, -0x15, -0x16,
447 -0x17, -0x18, -0x19, -0x1a, -0x1b, -0x1c, -0x1d, -0x1e, -0x1f, -0x20, -0x21,
448 -0x22, -0x23, -0x24, -0x25, -0x26, -0x27, -0x28, -0x29, -0x2a, -0x2b, -0x2c,
449 -0x2d, -0x2e, -0x2f, -0x30, -0x31, -0x32, -0x33, -0x34, -0x35, -0x36, -0x37,
450 -0x38, -0x39, -0x3a, -0x3b, -0x3c, -0x3d, -0x3e, -0x3f, -0x40,
451};
452
453// Lookup table for exp(m) with m = -104, ..., 89.
454// -104 = floor(log(single precision's min denormal))
455// 89 = ceil(log(single precision's max normal))
456// Table is generated with Sollya as follow:
457// > display = hexadecimal;
458// > for i from -104 to 89 do { D(exp(i)); };
459LIBC_INLINE_VAR constexpr double EXP_M1[195] = {
460 0x1.f1e6b68529e33p-151, 0x1.525be4e4e601dp-149, 0x1.cbe0a45f75eb1p-148,
461 0x1.3884e838aea68p-146, 0x1.a8c1f14e2af5dp-145, 0x1.20a717e64a9bdp-143,
462 0x1.8851d84118908p-142, 0x1.0a9bdfb02d240p-140, 0x1.6a5bea046b42ep-139,
463 0x1.ec7f3b269efa8p-138, 0x1.4eafb87eab0f2p-136, 0x1.c6e2d05bbc000p-135,
464 0x1.35208867c2683p-133, 0x1.a425b317eeacdp-132, 0x1.1d8508fa8246ap-130,
465 0x1.840fbc08fdc8ap-129, 0x1.07b7112bc1ffep-127, 0x1.666d0dad2961dp-126,
466 0x1.e726c3f64d0fep-125, 0x1.4b0dc07cabf98p-123, 0x1.c1f2daf3b6a46p-122,
467 0x1.31c5957a47de2p-120, 0x1.9f96445648b9fp-119, 0x1.1a6baeadb4fd1p-117,
468 0x1.7fd974d372e45p-116, 0x1.04da4d1452919p-114, 0x1.62891f06b3450p-113,
469 0x1.e1dd273aa8a4ap-112, 0x1.4775e0840bfddp-110, 0x1.bd109d9d94bdap-109,
470 0x1.2e73f53fba844p-107, 0x1.9b138170d6bfep-106, 0x1.175af0cf60ec5p-104,
471 0x1.7baee1bffa80bp-103, 0x1.02057d1245cebp-101, 0x1.5eafffb34ba31p-100,
472 0x1.dca23bae16424p-99, 0x1.43e7fc88b8056p-97, 0x1.b83bf23a9a9ebp-96,
473 0x1.2b2b8dd05b318p-94, 0x1.969d47321e4ccp-93, 0x1.1452b7723aed2p-91,
474 0x1.778fe2497184cp-90, 0x1.fe7116182e9ccp-89, 0x1.5ae191a99585ap-87,
475 0x1.d775d87da854dp-86, 0x1.4063f8cc8bb98p-84, 0x1.b374b315f87c1p-83,
476 0x1.27ec458c65e3cp-81, 0x1.923372c67a074p-80, 0x1.1152eaeb73c08p-78,
477 0x1.737c5645114b5p-77, 0x1.f8e6c24b5592ep-76, 0x1.571db733a9d61p-74,
478 0x1.d257d547e083fp-73, 0x1.3ce9b9de78f85p-71, 0x1.aebabae3a41b5p-70,
479 0x1.24b6031b49bdap-68, 0x1.8dd5e1bb09d7ep-67, 0x1.0e5b73d1ff53dp-65,
480 0x1.6f741de1748ecp-64, 0x1.f36bd37f42f3ep-63, 0x1.536452ee2f75cp-61,
481 0x1.cd480a1b74820p-60, 0x1.39792499b1a24p-58, 0x1.aa0de4bf35b38p-57,
482 0x1.2188ad6ae3303p-55, 0x1.898471fca6055p-54, 0x1.0b6c3afdde064p-52,
483 0x1.6b7719a59f0e0p-51, 0x1.ee001eed62aa0p-50, 0x1.4fb547c775da8p-48,
484 0x1.c8464f7616468p-47, 0x1.36121e24d3bbap-45, 0x1.a56e0c2ac7f75p-44,
485 0x1.1e642baeb84a0p-42, 0x1.853f01d6d53bap-41, 0x1.0885298767e9ap-39,
486 0x1.67852a7007e42p-38, 0x1.e8a37a45fc32ep-37, 0x1.4c1078fe9228ap-35,
487 0x1.c3527e433fab1p-34, 0x1.32b48bf117da2p-32, 0x1.a0db0d0ddb3ecp-31,
488 0x1.1b48655f37267p-29, 0x1.81056ff2c5772p-28, 0x1.05a628c699fa1p-26,
489 0x1.639e3175a689dp-25, 0x1.e355bbaee85cbp-24, 0x1.4875ca227ec38p-22,
490 0x1.be6c6fdb01612p-21, 0x1.2f6053b981d98p-19, 0x1.9c54c3b43bc8bp-18,
491 0x1.18354238f6764p-16, 0x1.7cd79b5647c9bp-15, 0x1.02cf22526545ap-13,
492 0x1.5fc21041027adp-12, 0x1.de16b9c24a98fp-11, 0x1.44e51f113d4d6p-9,
493 0x1.b993fe00d5376p-8, 0x1.2c155b8213cf4p-6, 0x1.97db0ccceb0afp-5,
494 0x1.152aaa3bf81ccp-3, 0x1.78b56362cef38p-2, 0x1.0000000000000p+0,
495 0x1.5bf0a8b145769p+1, 0x1.d8e64b8d4ddaep+2, 0x1.415e5bf6fb106p+4,
496 0x1.b4c902e273a58p+5, 0x1.28d389970338fp+7, 0x1.936dc5690c08fp+8,
497 0x1.122885aaeddaap+10, 0x1.749ea7d470c6ep+11, 0x1.fa7157c470f82p+12,
498 0x1.5829dcf950560p+14, 0x1.d3c4488ee4f7fp+15, 0x1.3de1654d37c9ap+17,
499 0x1.b00b5916ac955p+18, 0x1.259ac48bf05d7p+20, 0x1.8f0ccafad2a87p+21,
500 0x1.0f2ebd0a80020p+23, 0x1.709348c0ea4f9p+24, 0x1.f4f22091940bdp+25,
501 0x1.546d8f9ed26e1p+27, 0x1.ceb088b68e804p+28, 0x1.3a6e1fd9eecfdp+30,
502 0x1.ab5adb9c43600p+31, 0x1.226af33b1fdc1p+33, 0x1.8ab7fb5475fb7p+34,
503 0x1.0c3d3920962c9p+36, 0x1.6c932696a6b5dp+37, 0x1.ef822f7f6731dp+38,
504 0x1.50bba3796379ap+40, 0x1.c9aae4631c056p+41, 0x1.370470aec28edp+43,
505 0x1.a6b765d8cdf6dp+44, 0x1.1f43fcc4b662cp+46, 0x1.866f34a725782p+47,
506 0x1.0953e2f3a1ef7p+49, 0x1.689e221bc8d5bp+50, 0x1.ea215a1d20d76p+51,
507 0x1.4d13fbb1a001ap+53, 0x1.c4b334617cc67p+54, 0x1.33a43d282a519p+56,
508 0x1.a220d397972ebp+57, 0x1.1c25c88df6862p+59, 0x1.8232558201159p+60,
509 0x1.0672a3c9eb871p+62, 0x1.64b41c6d37832p+63, 0x1.e4cf766fe49bep+64,
510 0x1.49767bc0483e3p+66, 0x1.bfc951eb8bb76p+67, 0x1.304d6aeca254bp+69,
511 0x1.9d97010884251p+70, 0x1.19103e4080b45p+72, 0x1.7e013cd114461p+73,
512 0x1.03996528e074cp+75, 0x1.60d4f6fdac731p+76, 0x1.df8c5af17ba3bp+77,
513 0x1.45e3076d61699p+79, 0x1.baed16a6e0da7p+80, 0x1.2cffdfebde1a1p+82,
514 0x1.9919cabefcb69p+83, 0x1.160345c9953e3p+85, 0x1.79dbc9dc53c66p+86,
515 0x1.00c810d464097p+88, 0x1.5d009394c5c27p+89, 0x1.da57de8f107a8p+90,
516 0x1.425982cf597cdp+92, 0x1.b61e5ca3a5e31p+93, 0x1.29bb825dfcf87p+95,
517 0x1.94a90db0d6fe2p+96, 0x1.12fec759586fdp+98, 0x1.75c1dc469e3afp+99,
518 0x1.fbfd219c43b04p+100, 0x1.5936d44e1a146p+102, 0x1.d531d8a7ee79cp+103,
519 0x1.3ed9d24a2d51bp+105, 0x1.b15cfe5b6e17bp+106, 0x1.268038c2c0e00p+108,
520 0x1.9044a73545d48p+109, 0x1.1002ab6218b38p+111, 0x1.71b3540cbf921p+112,
521 0x1.f6799ea9c414ap+113, 0x1.55779b984f3ebp+115, 0x1.d01a210c44aa4p+116,
522 0x1.3b63da8e91210p+118, 0x1.aca8d6b0116b8p+119, 0x1.234de9e0c74e9p+121,
523 0x1.8bec7503ca477p+122, 0x1.0d0eda9796b90p+124, 0x1.6db0118477245p+125,
524 0x1.f1056dc7bf22dp+126, 0x1.51c2cc3433801p+128, 0x1.cb108ffbec164p+129,
525};
526
527// Lookup table for exp(m * 2^(-7)) with m = 0, ..., 127.
528// Table is generated with Sollya as follow:
529// > display = hexadecimal;
530// > for i from 0 to 127 do { D(exp(i / 128)); };
531LIBC_INLINE_VAR constexpr double EXP_M2[128] = {
532 0x1.0000000000000p0, 0x1.0202015600446p0, 0x1.04080ab55de39p0,
533 0x1.06122436410ddp0, 0x1.08205601127edp0, 0x1.0a32a84e9c1f6p0,
534 0x1.0c49236829e8cp0, 0x1.0e63cfa7ab09dp0, 0x1.1082b577d34edp0,
535 0x1.12a5dd543ccc5p0, 0x1.14cd4fc989cd6p0, 0x1.16f9157587069p0,
536 0x1.192937074e0cdp0, 0x1.1b5dbd3f68122p0, 0x1.1d96b0eff0e79p0,
537 0x1.1fd41afcba45ep0, 0x1.2216045b6f5cdp0, 0x1.245c7613b8a9bp0,
538 0x1.26a7793f60164p0, 0x1.28f7170a755fdp0, 0x1.2b4b58b372c79p0,
539 0x1.2da4478b620c7p0, 0x1.3001ecf601af7p0, 0x1.32645269ea829p0,
540 0x1.34cb8170b5835p0, 0x1.373783a722012p0, 0x1.39a862bd3c106p0,
541 0x1.3c1e2876834aap0, 0x1.3e98deaa11dccp0, 0x1.41188f42c3e32p0,
542 0x1.439d443f5f159p0, 0x1.462707b2bac21p0, 0x1.48b5e3c3e8186p0,
543 0x1.4b49e2ae5ac67p0, 0x1.4de30ec211e60p0, 0x1.50817263c13cdp0,
544 0x1.5325180cfacf7p0, 0x1.55ce0a4c58c7cp0, 0x1.587c53c5a7af0p0,
545 0x1.5b2fff3210fd9p0, 0x1.5de9176045ff5p0, 0x1.60a7a734ab0e8p0,
546 0x1.636bb9a983258p0, 0x1.663559cf1bc7cp0, 0x1.690492cbf9433p0,
547 0x1.6bd96fdd034a2p0, 0x1.6eb3fc55b1e76p0, 0x1.719443a03acb9p0,
548 0x1.747a513dbef6ap0, 0x1.776630c678bc1p0, 0x1.7a57ede9ea23ep0,
549 0x1.7d4f946f0ba8dp0, 0x1.804d30347b546p0, 0x1.8350cd30ac390p0,
550 0x1.865a7772164c5p0, 0x1.896a3b1f66a0ep0, 0x1.8c802477b0010p0,
551 0x1.8f9c3fd29beafp0, 0x1.92be99a09bf00p0, 0x1.95e73e6b1b75ep0,
552 0x1.99163ad4b1dccp0, 0x1.9c4b9b995509bp0, 0x1.9f876d8e8c566p0,
553 0x1.a2c9bda3a3e78p0, 0x1.a61298e1e069cp0, 0x1.a9620c6cb3374p0,
554 0x1.acb82581eee54p0, 0x1.b014f179fc3b8p0, 0x1.b3787dc80f95fp0,
555 0x1.b6e2d7fa5eb18p0, 0x1.ba540dba56e56p0, 0x1.bdcc2cccd3c85p0,
556 0x1.c14b431256446p0, 0x1.c4d15e873c193p0, 0x1.c85e8d43f7cd0p0,
557 0x1.cbf2dd7d490f2p0, 0x1.cf8e5d84758a9p0, 0x1.d3311bc7822b4p0,
558 0x1.d6db26d16cd67p0, 0x1.da8c8d4a66969p0, 0x1.de455df80e3c0p0,
559 0x1.e205a7bdab73ep0, 0x1.e5cd799c6a54ep0, 0x1.e99ce2b397649p0,
560 0x1.ed73f240dc142p0, 0x1.f152b7a07bb76p0, 0x1.f539424d90f5ep0,
561 0x1.f927a1e24bb76p0, 0x1.fd1de6182f8c9p0, 0x1.008e0f64294abp1,
562 0x1.02912df5ce72ap1, 0x1.049856cd84339p1, 0x1.06a39207f0a09p1,
563 0x1.08b2e7d2035cfp1, 0x1.0ac6606916501p1, 0x1.0cde041b0e9aep1,
564 0x1.0ef9db467dcf8p1, 0x1.1119ee5ac36b6p1, 0x1.133e45d82e952p1,
565 0x1.1566ea50201d7p1, 0x1.1793e4652cc50p1, 0x1.19c53ccb3fc6bp1,
566 0x1.1bfafc47bda73p1, 0x1.1e352bb1a74adp1, 0x1.2073d3f1bd518p1,
567 0x1.22b6fe02a3b9cp1, 0x1.24feb2f105cb8p1, 0x1.274afbdbba4a6p1,
568 0x1.299be1f3e7f1cp1, 0x1.2bf16e7d2a38cp1, 0x1.2e4baacdb6614p1,
569 0x1.30aaa04e80d05p1, 0x1.330e587b62b28p1, 0x1.3576dce33feadp1,
570 0x1.37e437282d4eep1, 0x1.3a5670ff972edp1, 0x1.3ccd9432682b4p1,
571 0x1.3f49aa9d30590p1, 0x1.41cabe304cb34p1, 0x1.4450d8f00edd4p1,
572 0x1.46dc04f4e5338p1, 0x1.496c4c6b832dap1, 0x1.4c01b9950a111p1,
573 0x1.4e9c56c731f5dp1, 0x1.513c2e6c731d7p1, 0x1.53e14b042f9cap1,
574 0x1.568bb722dd593p1, 0x1.593b7d72305bbp1,
575};
576
577} // namespace common_constants_internal
578
579} // namespace LIBC_NAMESPACE_DECL
580
581#endif // LLVM_LIBC_SRC___SUPPORT_MATH_COMMON_CONSTANTS_H
582