1 /* Shared data between exp, exp2 and pow.
2    Copyright (C) 2018-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #include "math_config.h"
20 
21 #define N (1 << EXP_TABLE_BITS)
22 
23 const struct exp_data __exp_data = {
24 // N/ln2
25 .invln2N = 0x1.71547652b82fep0 * N,
26 // -ln2/N
27 #if N == 128
28 .negln2hiN = -0x1.62e42fefa0000p-8,
29 .negln2loN = -0x1.cf79abc9e3b3ap-47,
30 #endif
31 // Used for rounding when !TOINT_INTRINSICS
32 .shift = 0x1.8p52,
33 // exp polynomial coefficients.
34 .poly = {
35 #if N == 128 && EXP_POLY_ORDER == 5
36 // abs error: 1.555*2^-66
37 // ulp error: 0.509 (0.511 without fma)
38 // if |x| < ln2/256+eps
39 // abs error if |x| < ln2/128: 1.7145*2^-56
40 0x1.ffffffffffdbdp-2,
41 0x1.555555555543cp-3,
42 0x1.55555cf172b91p-5,
43 0x1.1111167a4d017p-7,
44 #endif
45 },
46 .exp2_shift = 0x1.8p52 / N,
47 // exp2 polynomial coefficients.
48 .exp2_poly = {
49 #if N == 128 && EXP2_POLY_ORDER == 5
50 // abs error: 1.2195*2^-65
51 // ulp error: 0.507 (0.511 without fma)
52 // if |x| < 1/256
53 // abs error if |x| < 1/128: 1.9941*2^-56
54 0x1.62e42fefa39efp-1,
55 0x1.ebfbdff82c424p-3,
56 0x1.c6b08d70cf4b5p-5,
57 0x1.3b2abd24650ccp-7,
58 0x1.5d7e09b4e3a84p-10,
59 #endif
60 },
61 // 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N)
62 // tab[2*k] = asuint64(T[k])
63 // tab[2*k+1] = asuint64(H[k]) - (k << 52)/N
64 .tab = {
65 #if N == 128
66 0x0, 0x3ff0000000000000,
67 0x3c9b3b4f1a88bf6e, 0x3feff63da9fb3335,
68 0xbc7160139cd8dc5d, 0x3fefec9a3e778061,
69 0xbc905e7a108766d1, 0x3fefe315e86e7f85,
70 0x3c8cd2523567f613, 0x3fefd9b0d3158574,
71 0xbc8bce8023f98efa, 0x3fefd06b29ddf6de,
72 0x3c60f74e61e6c861, 0x3fefc74518759bc8,
73 0x3c90a3e45b33d399, 0x3fefbe3ecac6f383,
74 0x3c979aa65d837b6d, 0x3fefb5586cf9890f,
75 0x3c8eb51a92fdeffc, 0x3fefac922b7247f7,
76 0x3c3ebe3d702f9cd1, 0x3fefa3ec32d3d1a2,
77 0xbc6a033489906e0b, 0x3fef9b66affed31b,
78 0xbc9556522a2fbd0e, 0x3fef9301d0125b51,
79 0xbc5080ef8c4eea55, 0x3fef8abdc06c31cc,
80 0xbc91c923b9d5f416, 0x3fef829aaea92de0,
81 0x3c80d3e3e95c55af, 0x3fef7a98c8a58e51,
82 0xbc801b15eaa59348, 0x3fef72b83c7d517b,
83 0xbc8f1ff055de323d, 0x3fef6af9388c8dea,
84 0x3c8b898c3f1353bf, 0x3fef635beb6fcb75,
85 0xbc96d99c7611eb26, 0x3fef5be084045cd4,
86 0x3c9aecf73e3a2f60, 0x3fef54873168b9aa,
87 0xbc8fe782cb86389d, 0x3fef4d5022fcd91d,
88 0x3c8a6f4144a6c38d, 0x3fef463b88628cd6,
89 0x3c807a05b0e4047d, 0x3fef3f49917ddc96,
90 0x3c968efde3a8a894, 0x3fef387a6e756238,
91 0x3c875e18f274487d, 0x3fef31ce4fb2a63f,
92 0x3c80472b981fe7f2, 0x3fef2b4565e27cdd,
93 0xbc96b87b3f71085e, 0x3fef24dfe1f56381,
94 0x3c82f7e16d09ab31, 0x3fef1e9df51fdee1,
95 0xbc3d219b1a6fbffa, 0x3fef187fd0dad990,
96 0x3c8b3782720c0ab4, 0x3fef1285a6e4030b,
97 0x3c6e149289cecb8f, 0x3fef0cafa93e2f56,
98 0x3c834d754db0abb6, 0x3fef06fe0a31b715,
99 0x3c864201e2ac744c, 0x3fef0170fc4cd831,
100 0x3c8fdd395dd3f84a, 0x3feefc08b26416ff,
101 0xbc86a3803b8e5b04, 0x3feef6c55f929ff1,
102 0xbc924aedcc4b5068, 0x3feef1a7373aa9cb,
103 0xbc9907f81b512d8e, 0x3feeecae6d05d866,
104 0xbc71d1e83e9436d2, 0x3feee7db34e59ff7,
105 0xbc991919b3ce1b15, 0x3feee32dc313a8e5,
106 0x3c859f48a72a4c6d, 0x3feedea64c123422,
107 0xbc9312607a28698a, 0x3feeda4504ac801c,
108 0xbc58a78f4817895b, 0x3feed60a21f72e2a,
109 0xbc7c2c9b67499a1b, 0x3feed1f5d950a897,
110 0x3c4363ed60c2ac11, 0x3feece086061892d,
111 0x3c9666093b0664ef, 0x3feeca41ed1d0057,
112 0x3c6ecce1daa10379, 0x3feec6a2b5c13cd0,
113 0x3c93ff8e3f0f1230, 0x3feec32af0d7d3de,
114 0x3c7690cebb7aafb0, 0x3feebfdad5362a27,
115 0x3c931dbdeb54e077, 0x3feebcb299fddd0d,
116 0xbc8f94340071a38e, 0x3feeb9b2769d2ca7,
117 0xbc87deccdc93a349, 0x3feeb6daa2cf6642,
118 0xbc78dec6bd0f385f, 0x3feeb42b569d4f82,
119 0xbc861246ec7b5cf6, 0x3feeb1a4ca5d920f,
120 0x3c93350518fdd78e, 0x3feeaf4736b527da,
121 0x3c7b98b72f8a9b05, 0x3feead12d497c7fd,
122 0x3c9063e1e21c5409, 0x3feeab07dd485429,
123 0x3c34c7855019c6ea, 0x3feea9268a5946b7,
124 0x3c9432e62b64c035, 0x3feea76f15ad2148,
125 0xbc8ce44a6199769f, 0x3feea5e1b976dc09,
126 0xbc8c33c53bef4da8, 0x3feea47eb03a5585,
127 0xbc845378892be9ae, 0x3feea34634ccc320,
128 0xbc93cedd78565858, 0x3feea23882552225,
129 0x3c5710aa807e1964, 0x3feea155d44ca973,
130 0xbc93b3efbf5e2228, 0x3feea09e667f3bcd,
131 0xbc6a12ad8734b982, 0x3feea012750bdabf,
132 0xbc6367efb86da9ee, 0x3fee9fb23c651a2f,
133 0xbc80dc3d54e08851, 0x3fee9f7df9519484,
134 0xbc781f647e5a3ecf, 0x3fee9f75e8ec5f74,
135 0xbc86ee4ac08b7db0, 0x3fee9f9a48a58174,
136 0xbc8619321e55e68a, 0x3fee9feb564267c9,
137 0x3c909ccb5e09d4d3, 0x3feea0694fde5d3f,
138 0xbc7b32dcb94da51d, 0x3feea11473eb0187,
139 0x3c94ecfd5467c06b, 0x3feea1ed0130c132,
140 0x3c65ebe1abd66c55, 0x3feea2f336cf4e62,
141 0xbc88a1c52fb3cf42, 0x3feea427543e1a12,
142 0xbc9369b6f13b3734, 0x3feea589994cce13,
143 0xbc805e843a19ff1e, 0x3feea71a4623c7ad,
144 0xbc94d450d872576e, 0x3feea8d99b4492ed,
145 0x3c90ad675b0e8a00, 0x3feeaac7d98a6699,
146 0x3c8db72fc1f0eab4, 0x3feeace5422aa0db,
147 0xbc65b6609cc5e7ff, 0x3feeaf3216b5448c,
148 0x3c7bf68359f35f44, 0x3feeb1ae99157736,
149 0xbc93091fa71e3d83, 0x3feeb45b0b91ffc6,
150 0xbc5da9b88b6c1e29, 0x3feeb737b0cdc5e5,
151 0xbc6c23f97c90b959, 0x3feeba44cbc8520f,
152 0xbc92434322f4f9aa, 0x3feebd829fde4e50,
153 0xbc85ca6cd7668e4b, 0x3feec0f170ca07ba,
154 0x3c71affc2b91ce27, 0x3feec49182a3f090,
155 0x3c6dd235e10a73bb, 0x3feec86319e32323,
156 0xbc87c50422622263, 0x3feecc667b5de565,
157 0x3c8b1c86e3e231d5, 0x3feed09bec4a2d33,
158 0xbc91bbd1d3bcbb15, 0x3feed503b23e255d,
159 0x3c90cc319cee31d2, 0x3feed99e1330b358,
160 0x3c8469846e735ab3, 0x3feede6b5579fdbf,
161 0xbc82dfcd978e9db4, 0x3feee36bbfd3f37a,
162 0x3c8c1a7792cb3387, 0x3feee89f995ad3ad,
163 0xbc907b8f4ad1d9fa, 0x3feeee07298db666,
164 0xbc55c3d956dcaeba, 0x3feef3a2b84f15fb,
165 0xbc90a40e3da6f640, 0x3feef9728de5593a,
166 0xbc68d6f438ad9334, 0x3feeff76f2fb5e47,
167 0xbc91eee26b588a35, 0x3fef05b030a1064a,
168 0x3c74ffd70a5fddcd, 0x3fef0c1e904bc1d2,
169 0xbc91bdfbfa9298ac, 0x3fef12c25bd71e09,
170 0x3c736eae30af0cb3, 0x3fef199bdd85529c,
171 0x3c8ee3325c9ffd94, 0x3fef20ab5fffd07a,
172 0x3c84e08fd10959ac, 0x3fef27f12e57d14b,
173 0x3c63cdaf384e1a67, 0x3fef2f6d9406e7b5,
174 0x3c676b2c6c921968, 0x3fef3720dcef9069,
175 0xbc808a1883ccb5d2, 0x3fef3f0b555dc3fa,
176 0xbc8fad5d3ffffa6f, 0x3fef472d4a07897c,
177 0xbc900dae3875a949, 0x3fef4f87080d89f2,
178 0x3c74a385a63d07a7, 0x3fef5818dcfba487,
179 0xbc82919e2040220f, 0x3fef60e316c98398,
180 0x3c8e5a50d5c192ac, 0x3fef69e603db3285,
181 0x3c843a59ac016b4b, 0x3fef7321f301b460,
182 0xbc82d52107b43e1f, 0x3fef7c97337b9b5f,
183 0xbc892ab93b470dc9, 0x3fef864614f5a129,
184 0x3c74b604603a88d3, 0x3fef902ee78b3ff6,
185 0x3c83c5ec519d7271, 0x3fef9a51fbc74c83,
186 0xbc8ff7128fd391f0, 0x3fefa4afa2a490da,
187 0xbc8dae98e223747d, 0x3fefaf482d8e67f1,
188 0x3c8ec3bc41aa2008, 0x3fefba1bee615a27,
189 0x3c842b94c3a9eb32, 0x3fefc52b376bba97,
190 0x3c8a64a931d185ee, 0x3fefd0765b6e4540,
191 0xbc8e37bae43be3ed, 0x3fefdbfdad9cbe14,
192 0x3c77893b4d91cd9d, 0x3fefe7c1819e90d8,
193 0x3c5305c14160cc89, 0x3feff3c22b8f71f1,
194 #endif
195 },
196 };
197