1 /*							j1l.c
2  *
3  *	Bessel function of order one
4  *
5  *
6  *
7  * SYNOPSIS:
8  *
9  * long double x, y, j1l();
10  *
11  * y = j1l( x );
12  *
13  *
14  *
15  * DESCRIPTION:
16  *
17  * Returns Bessel function of first kind, order one of the argument.
18  *
19  * The domain is divided into two major intervals [0, 2] and
20  * (2, infinity). In the first interval the rational approximation is
21  * J1(x) = .5x + x x^2 R(x^2)
22  *
23  * The second interval is further partitioned into eight equal segments
24  * of 1/x.
25  * J1(x) = sqrt(2/(pi x)) (P1(x) cos(X) - Q1(x) sin(X)),
26  * X = x - 3 pi / 4,
27  *
28  * and the auxiliary functions are given by
29  *
30  * J1(x)cos(X) + Y1(x)sin(X) = sqrt( 2/(pi x)) P1(x),
31  * P1(x) = 1 + 1/x^2 R(1/x^2)
32  *
33  * Y1(x)cos(X) - J1(x)sin(X) = sqrt( 2/(pi x)) Q1(x),
34  * Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)).
35  *
36  *
37  *
38  * ACCURACY:
39  *
40  *                      Absolute error:
41  * arithmetic   domain      # trials      peak         rms
42  *    IEEE      0, 30       100000      2.8e-34      2.7e-35
43  *
44  *
45  */
46 
47 /*							y1l.c
48  *
49  *	Bessel function of the second kind, order one
50  *
51  *
52  *
53  * SYNOPSIS:
54  *
55  * double x, y, y1l();
56  *
57  * y = y1l( x );
58  *
59  *
60  *
61  * DESCRIPTION:
62  *
63  * Returns Bessel function of the second kind, of order
64  * one, of the argument.
65  *
66  * The domain is divided into two major intervals [0, 2] and
67  * (2, infinity). In the first interval the rational approximation is
68  * Y1(x) = 2/pi * (log(x) * J1(x) - 1/x) + x R(x^2) .
69  * In the second interval the approximation is the same as for J1(x), and
70  * Y1(x) = sqrt(2/(pi x)) (P1(x) sin(X) + Q1(x) cos(X)),
71  * X = x - 3 pi / 4.
72  *
73  * ACCURACY:
74  *
75  *  Absolute error, when y0(x) < 1; else relative error:
76  *
77  * arithmetic   domain     # trials      peak         rms
78  *    IEEE      0, 30       100000      2.7e-34     2.9e-35
79  *
80  */
81 
82 /* Copyright 2001 by Stephen L. Moshier (moshier@na-net.onrl.gov).
83 
84     This library is free software; you can redistribute it and/or
85     modify it under the terms of the GNU Lesser General Public
86     License as published by the Free Software Foundation; either
87     version 2.1 of the License, or (at your option) any later version.
88 
89     This library is distributed in the hope that it will be useful,
90     but WITHOUT ANY WARRANTY; without even the implied warranty of
91     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
92     Lesser General Public License for more details.
93 
94     You should have received a copy of the GNU Lesser General Public
95     License along with this library; if not, see
96     <https://www.gnu.org/licenses/>.  */
97 
98 #include <errno.h>
99 #include <math.h>
100 #include <math_private.h>
101 #include <fenv_private.h>
102 #include <math-underflow.h>
103 #include <float.h>
104 #include <libm-alias-finite.h>
105 
106 /* 1 / sqrt(pi) */
107 static const _Float128 ONEOSQPI = L(5.6418958354775628694807945156077258584405E-1);
108 /* 2 / pi */
109 static const _Float128 TWOOPI = L(6.3661977236758134307553505349005744813784E-1);
110 static const _Float128 zero = 0;
111 
112 /* J1(x) = .5x + x x^2 R(x^2)
113    Peak relative error 1.9e-35
114    0 <= x <= 2  */
115 #define NJ0_2N 6
116 static const _Float128 J0_2N[NJ0_2N + 1] = {
117  L(-5.943799577386942855938508697619735179660E16),
118   L(1.812087021305009192259946997014044074711E15),
119  L(-2.761698314264509665075127515729146460895E13),
120   L(2.091089497823600978949389109350658815972E11),
121  L(-8.546413231387036372945453565654130054307E8),
122   L(1.797229225249742247475464052741320612261E6),
123  L(-1.559552840946694171346552770008812083969E3)
124 };
125 #define NJ0_2D 6
126 static const _Float128 J0_2D[NJ0_2D + 1] = {
127   L(9.510079323819108569501613916191477479397E17),
128   L(1.063193817503280529676423936545854693915E16),
129   L(5.934143516050192600795972192791775226920E13),
130   L(2.168000911950620999091479265214368352883E11),
131   L(5.673775894803172808323058205986256928794E8),
132   L(1.080329960080981204840966206372671147224E6),
133   L(1.411951256636576283942477881535283304912E3),
134  /* 1.000000000000000000000000000000000000000E0L */
135 };
136 
137 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
138    0 <= 1/x <= .0625
139    Peak relative error 3.6e-36  */
140 #define NP16_IN 9
141 static const _Float128 P16_IN[NP16_IN + 1] = {
142   L(5.143674369359646114999545149085139822905E-16),
143   L(4.836645664124562546056389268546233577376E-13),
144   L(1.730945562285804805325011561498453013673E-10),
145   L(3.047976856147077889834905908605310585810E-8),
146   L(2.855227609107969710407464739188141162386E-6),
147   L(1.439362407936705484122143713643023998457E-4),
148   L(3.774489768532936551500999699815873422073E-3),
149   L(4.723962172984642566142399678920790598426E-2),
150   L(2.359289678988743939925017240478818248735E-1),
151   L(3.032580002220628812728954785118117124520E-1),
152 };
153 #define NP16_ID 9
154 static const _Float128 P16_ID[NP16_ID + 1] = {
155   L(4.389268795186898018132945193912677177553E-15),
156   L(4.132671824807454334388868363256830961655E-12),
157   L(1.482133328179508835835963635130894413136E-9),
158   L(2.618941412861122118906353737117067376236E-7),
159   L(2.467854246740858470815714426201888034270E-5),
160   L(1.257192927368839847825938545925340230490E-3),
161   L(3.362739031941574274949719324644120720341E-2),
162   L(4.384458231338934105875343439265370178858E-1),
163   L(2.412830809841095249170909628197264854651E0),
164   L(4.176078204111348059102962617368214856874E0),
165  /* 1.000000000000000000000000000000000000000E0 */
166 };
167 
168 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
169     0.0625 <= 1/x <= 0.125
170     Peak relative error 1.9e-36  */
171 #define NP8_16N 11
172 static const _Float128 P8_16N[NP8_16N + 1] = {
173   L(2.984612480763362345647303274082071598135E-16),
174   L(1.923651877544126103941232173085475682334E-13),
175   L(4.881258879388869396043760693256024307743E-11),
176   L(6.368866572475045408480898921866869811889E-9),
177   L(4.684818344104910450523906967821090796737E-7),
178   L(2.005177298271593587095982211091300382796E-5),
179   L(4.979808067163957634120681477207147536182E-4),
180   L(6.946005761642579085284689047091173581127E-3),
181   L(5.074601112955765012750207555985299026204E-2),
182   L(1.698599455896180893191766195194231825379E-1),
183   L(1.957536905259237627737222775573623779638E-1),
184   L(2.991314703282528370270179989044994319374E-2),
185 };
186 #define NP8_16D 10
187 static const _Float128 P8_16D[NP8_16D + 1] = {
188   L(2.546869316918069202079580939942463010937E-15),
189   L(1.644650111942455804019788382157745229955E-12),
190   L(4.185430770291694079925607420808011147173E-10),
191   L(5.485331966975218025368698195861074143153E-8),
192   L(4.062884421686912042335466327098932678905E-6),
193   L(1.758139661060905948870523641319556816772E-4),
194   L(4.445143889306356207566032244985607493096E-3),
195   L(6.391901016293512632765621532571159071158E-2),
196   L(4.933040207519900471177016015718145795434E-1),
197   L(1.839144086168947712971630337250761842976E0),
198   L(2.715120873995490920415616716916149586579E0),
199  /* 1.000000000000000000000000000000000000000E0 */
200 };
201 
202 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
203   0.125 <= 1/x <= 0.1875
204   Peak relative error 1.3e-36  */
205 #define NP5_8N 10
206 static const _Float128 P5_8N[NP5_8N + 1] = {
207   L(2.837678373978003452653763806968237227234E-12),
208   L(9.726641165590364928442128579282742354806E-10),
209   L(1.284408003604131382028112171490633956539E-7),
210   L(8.524624695868291291250573339272194285008E-6),
211   L(3.111516908953172249853673787748841282846E-4),
212   L(6.423175156126364104172801983096596409176E-3),
213   L(7.430220589989104581004416356260692450652E-2),
214   L(4.608315409833682489016656279567605536619E-1),
215   L(1.396870223510964882676225042258855977512E0),
216   L(1.718500293904122365894630460672081526236E0),
217   L(5.465927698800862172307352821870223855365E-1)
218 };
219 #define NP5_8D 10
220 static const _Float128 P5_8D[NP5_8D + 1] = {
221   L(2.421485545794616609951168511612060482715E-11),
222   L(8.329862750896452929030058039752327232310E-9),
223   L(1.106137992233383429630592081375289010720E-6),
224   L(7.405786153760681090127497796448503306939E-5),
225   L(2.740364785433195322492093333127633465227E-3),
226   L(5.781246470403095224872243564165254652198E-2),
227   L(6.927711353039742469918754111511109983546E-1),
228   L(4.558679283460430281188304515922826156690E0),
229   L(1.534468499844879487013168065728837900009E1),
230   L(2.313927430889218597919624843161569422745E1),
231   L(1.194506341319498844336768473218382828637E1),
232  /* 1.000000000000000000000000000000000000000E0 */
233 };
234 
235 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
236    Peak relative error 1.4e-36
237    0.1875 <= 1/x <= 0.25  */
238 #define NP4_5N 10
239 static const _Float128 P4_5N[NP4_5N + 1] = {
240   L(1.846029078268368685834261260420933914621E-10),
241   L(3.916295939611376119377869680335444207768E-8),
242   L(3.122158792018920627984597530935323997312E-6),
243   L(1.218073444893078303994045653603392272450E-4),
244   L(2.536420827983485448140477159977981844883E-3),
245   L(2.883011322006690823959367922241169171315E-2),
246   L(1.755255190734902907438042414495469810830E-1),
247   L(5.379317079922628599870898285488723736599E-1),
248   L(7.284904050194300773890303361501726561938E-1),
249   L(3.270110346613085348094396323925000362813E-1),
250   L(1.804473805689725610052078464951722064757E-2),
251 };
252 #define NP4_5D 9
253 static const _Float128 P4_5D[NP4_5D + 1] = {
254   L(1.575278146806816970152174364308980863569E-9),
255   L(3.361289173657099516191331123405675054321E-7),
256   L(2.704692281550877810424745289838790693708E-5),
257   L(1.070854930483999749316546199273521063543E-3),
258   L(2.282373093495295842598097265627962125411E-2),
259   L(2.692025460665354148328762368240343249830E-1),
260   L(1.739892942593664447220951225734811133759E0),
261   L(5.890727576752230385342377570386657229324E0),
262   L(9.517442287057841500750256954117735128153E0),
263   L(6.100616353935338240775363403030137736013E0),
264  /* 1.000000000000000000000000000000000000000E0 */
265 };
266 
267 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
268    Peak relative error 3.0e-36
269    0.25 <= 1/x <= 0.3125  */
270 #define NP3r2_4N 9
271 static const _Float128 P3r2_4N[NP3r2_4N + 1] = {
272   L(8.240803130988044478595580300846665863782E-8),
273   L(1.179418958381961224222969866406483744580E-5),
274   L(6.179787320956386624336959112503824397755E-4),
275   L(1.540270833608687596420595830747166658383E-2),
276   L(1.983904219491512618376375619598837355076E-1),
277   L(1.341465722692038870390470651608301155565E0),
278   L(4.617865326696612898792238245990854646057E0),
279   L(7.435574801812346424460233180412308000587E0),
280   L(4.671327027414635292514599201278557680420E0),
281   L(7.299530852495776936690976966995187714739E-1),
282 };
283 #define NP3r2_4D 9
284 static const _Float128 P3r2_4D[NP3r2_4D + 1] = {
285   L(7.032152009675729604487575753279187576521E-7),
286   L(1.015090352324577615777511269928856742848E-4),
287   L(5.394262184808448484302067955186308730620E-3),
288   L(1.375291438480256110455809354836988584325E-1),
289   L(1.836247144461106304788160919310404376670E0),
290   L(1.314378564254376655001094503090935880349E1),
291   L(4.957184590465712006934452500894672343488E1),
292   L(9.287394244300647738855415178790263465398E1),
293   L(7.652563275535900609085229286020552768399E1),
294   L(2.147042473003074533150718117770093209096E1),
295  /* 1.000000000000000000000000000000000000000E0 */
296 };
297 
298 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
299    Peak relative error 1.0e-35
300    0.3125 <= 1/x <= 0.375  */
301 #define NP2r7_3r2N 9
302 static const _Float128 P2r7_3r2N[NP2r7_3r2N + 1] = {
303   L(4.599033469240421554219816935160627085991E-7),
304   L(4.665724440345003914596647144630893997284E-5),
305   L(1.684348845667764271596142716944374892756E-3),
306   L(2.802446446884455707845985913454440176223E-2),
307   L(2.321937586453963310008279956042545173930E-1),
308   L(9.640277413988055668692438709376437553804E-1),
309   L(1.911021064710270904508663334033003246028E0),
310   L(1.600811610164341450262992138893970224971E0),
311   L(4.266299218652587901171386591543457861138E-1),
312   L(1.316470424456061252962568223251247207325E-2),
313 };
314 #define NP2r7_3r2D 8
315 static const _Float128 P2r7_3r2D[NP2r7_3r2D + 1] = {
316   L(3.924508608545520758883457108453520099610E-6),
317   L(4.029707889408829273226495756222078039823E-4),
318   L(1.484629715787703260797886463307469600219E-2),
319   L(2.553136379967180865331706538897231588685E-1),
320   L(2.229457223891676394409880026887106228740E0),
321   L(1.005708903856384091956550845198392117318E1),
322   L(2.277082659664386953166629360352385889558E1),
323   L(2.384726835193630788249826630376533988245E1),
324   L(9.700989749041320895890113781610939632410E0),
325  /* 1.000000000000000000000000000000000000000E0 */
326 };
327 
328 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
329    Peak relative error 1.7e-36
330    0.3125 <= 1/x <= 0.4375  */
331 #define NP2r3_2r7N 9
332 static const _Float128 P2r3_2r7N[NP2r3_2r7N + 1] = {
333   L(3.916766777108274628543759603786857387402E-6),
334   L(3.212176636756546217390661984304645137013E-4),
335   L(9.255768488524816445220126081207248947118E-3),
336   L(1.214853146369078277453080641911700735354E-1),
337   L(7.855163309847214136198449861311404633665E-1),
338   L(2.520058073282978403655488662066019816540E0),
339   L(3.825136484837545257209234285382183711466E0),
340   L(2.432569427554248006229715163865569506873E0),
341   L(4.877934835018231178495030117729800489743E-1),
342   L(1.109902737860249670981355149101343427885E-2),
343 };
344 #define NP2r3_2r7D 8
345 static const _Float128 P2r3_2r7D[NP2r3_2r7D + 1] = {
346   L(3.342307880794065640312646341190547184461E-5),
347   L(2.782182891138893201544978009012096558265E-3),
348   L(8.221304931614200702142049236141249929207E-2),
349   L(1.123728246291165812392918571987858010949E0),
350   L(7.740482453652715577233858317133423434590E0),
351   L(2.737624677567945952953322566311201919139E1),
352   L(4.837181477096062403118304137851260715475E1),
353   L(3.941098643468580791437772701093795299274E1),
354   L(1.245821247166544627558323920382547533630E1),
355  /* 1.000000000000000000000000000000000000000E0 */
356 };
357 
358 /* J1(x)cosX + Y1(x)sinX = sqrt( 2/(pi x)) P1(x), P1(x) = 1 + 1/x^2 R(1/x^2),
359    Peak relative error 1.7e-35
360    0.4375 <= 1/x <= 0.5  */
361 #define NP2_2r3N 8
362 static const _Float128 P2_2r3N[NP2_2r3N + 1] = {
363   L(3.397930802851248553545191160608731940751E-4),
364   L(2.104020902735482418784312825637833698217E-2),
365   L(4.442291771608095963935342749477836181939E-1),
366   L(4.131797328716583282869183304291833754967E0),
367   L(1.819920169779026500146134832455189917589E1),
368   L(3.781779616522937565300309684282401791291E1),
369   L(3.459605449728864218972931220783543410347E1),
370   L(1.173594248397603882049066603238568316561E1),
371   L(9.455702270242780642835086549285560316461E-1),
372 };
373 #define NP2_2r3D 8
374 static const _Float128 P2_2r3D[NP2_2r3D + 1] = {
375   L(2.899568897241432883079888249845707400614E-3),
376   L(1.831107138190848460767699919531132426356E-1),
377   L(3.999350044057883839080258832758908825165E0),
378   L(3.929041535867957938340569419874195303712E1),
379   L(1.884245613422523323068802689915538908291E2),
380   L(4.461469948819229734353852978424629815929E2),
381   L(5.004998753999796821224085972610636347903E2),
382   L(2.386342520092608513170837883757163414100E2),
383   L(3.791322528149347975999851588922424189957E1),
384  /* 1.000000000000000000000000000000000000000E0 */
385 };
386 
387 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
388    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
389    Peak relative error 8.0e-36
390    0 <= 1/x <= .0625  */
391 #define NQ16_IN 10
392 static const _Float128 Q16_IN[NQ16_IN + 1] = {
393   L(-3.917420835712508001321875734030357393421E-18),
394   L(-4.440311387483014485304387406538069930457E-15),
395   L(-1.951635424076926487780929645954007139616E-12),
396   L(-4.318256438421012555040546775651612810513E-10),
397   L(-5.231244131926180765270446557146989238020E-8),
398   L(-3.540072702902043752460711989234732357653E-6),
399   L(-1.311017536555269966928228052917534882984E-4),
400   L(-2.495184669674631806622008769674827575088E-3),
401   L(-2.141868222987209028118086708697998506716E-2),
402   L(-6.184031415202148901863605871197272650090E-2),
403   L(-1.922298704033332356899546792898156493887E-2),
404 };
405 #define NQ16_ID 9
406 static const _Float128 Q16_ID[NQ16_ID + 1] = {
407   L(3.820418034066293517479619763498400162314E-17),
408   L(4.340702810799239909648911373329149354911E-14),
409   L(1.914985356383416140706179933075303538524E-11),
410   L(4.262333682610888819476498617261895474330E-9),
411   L(5.213481314722233980346462747902942182792E-7),
412   L(3.585741697694069399299005316809954590558E-5),
413   L(1.366513429642842006385029778105539457546E-3),
414   L(2.745282599850704662726337474371355160594E-2),
415   L(2.637644521611867647651200098449903330074E-1),
416   L(1.006953426110765984590782655598680488746E0),
417  /* 1.000000000000000000000000000000000000000E0 */
418  };
419 
420 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
421    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
422    Peak relative error 1.9e-36
423    0.0625 <= 1/x <= 0.125  */
424 #define NQ8_16N 11
425 static const _Float128 Q8_16N[NQ8_16N + 1] = {
426   L(-2.028630366670228670781362543615221542291E-17),
427   L(-1.519634620380959966438130374006858864624E-14),
428   L(-4.540596528116104986388796594639405114524E-12),
429   L(-7.085151756671466559280490913558388648274E-10),
430   L(-6.351062671323970823761883833531546885452E-8),
431   L(-3.390817171111032905297982523519503522491E-6),
432   L(-1.082340897018886970282138836861233213972E-4),
433   L(-2.020120801187226444822977006648252379508E-3),
434   L(-2.093169910981725694937457070649605557555E-2),
435   L(-1.092176538874275712359269481414448063393E-1),
436   L(-2.374790947854765809203590474789108718733E-1),
437   L(-1.365364204556573800719985118029601401323E-1),
438 };
439 #define NQ8_16D 11
440 static const _Float128 Q8_16D[NQ8_16D + 1] = {
441   L(1.978397614733632533581207058069628242280E-16),
442   L(1.487361156806202736877009608336766720560E-13),
443   L(4.468041406888412086042576067133365913456E-11),
444   L(7.027822074821007443672290507210594648877E-9),
445   L(6.375740580686101224127290062867976007374E-7),
446   L(3.466887658320002225888644977076410421940E-5),
447   L(1.138625640905289601186353909213719596986E-3),
448   L(2.224470799470414663443449818235008486439E-2),
449   L(2.487052928527244907490589787691478482358E-1),
450   L(1.483927406564349124649083853892380899217E0),
451   L(4.182773513276056975777258788903489507705E0),
452   L(4.419665392573449746043880892524360870944E0),
453  /* 1.000000000000000000000000000000000000000E0 */
454 };
455 
456 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
457    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
458    Peak relative error 1.5e-35
459    0.125 <= 1/x <= 0.1875  */
460 #define NQ5_8N 10
461 static const _Float128 Q5_8N[NQ5_8N + 1] = {
462   L(-3.656082407740970534915918390488336879763E-13),
463   L(-1.344660308497244804752334556734121771023E-10),
464   L(-1.909765035234071738548629788698150760791E-8),
465   L(-1.366668038160120210269389551283666716453E-6),
466   L(-5.392327355984269366895210704976314135683E-5),
467   L(-1.206268245713024564674432357634540343884E-3),
468   L(-1.515456784370354374066417703736088291287E-2),
469   L(-1.022454301137286306933217746545237098518E-1),
470   L(-3.373438906472495080504907858424251082240E-1),
471   L(-4.510782522110845697262323973549178453405E-1),
472   L(-1.549000892545288676809660828213589804884E-1),
473 };
474 #define NQ5_8D 10
475 static const _Float128 Q5_8D[NQ5_8D + 1] = {
476   L(3.565550843359501079050699598913828460036E-12),
477   L(1.321016015556560621591847454285330528045E-9),
478   L(1.897542728662346479999969679234270605975E-7),
479   L(1.381720283068706710298734234287456219474E-5),
480   L(5.599248147286524662305325795203422873725E-4),
481   L(1.305442352653121436697064782499122164843E-2),
482   L(1.750234079626943298160445750078631894985E-1),
483   L(1.311420542073436520965439883806946678491E0),
484   L(5.162757689856842406744504211089724926650E0),
485   L(9.527760296384704425618556332087850581308E0),
486   L(6.604648207463236667912921642545100248584E0),
487  /* 1.000000000000000000000000000000000000000E0 */
488 };
489 
490 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
491    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
492    Peak relative error 1.3e-35
493    0.1875 <= 1/x <= 0.25  */
494 #define NQ4_5N 10
495 static const _Float128 Q4_5N[NQ4_5N + 1] = {
496   L(-4.079513568708891749424783046520200903755E-11),
497   L(-9.326548104106791766891812583019664893311E-9),
498   L(-8.016795121318423066292906123815687003356E-7),
499   L(-3.372350544043594415609295225664186750995E-5),
500   L(-7.566238665947967882207277686375417983917E-4),
501   L(-9.248861580055565402130441618521591282617E-3),
502   L(-6.033106131055851432267702948850231270338E-2),
503   L(-1.966908754799996793730369265431584303447E-1),
504   L(-2.791062741179964150755788226623462207560E-1),
505   L(-1.255478605849190549914610121863534191666E-1),
506   L(-4.320429862021265463213168186061696944062E-3),
507 };
508 #define NQ4_5D 9
509 static const _Float128 Q4_5D[NQ4_5D + 1] = {
510   L(3.978497042580921479003851216297330701056E-10),
511   L(9.203304163828145809278568906420772246666E-8),
512   L(8.059685467088175644915010485174545743798E-6),
513   L(3.490187375993956409171098277561669167446E-4),
514   L(8.189109654456872150100501732073810028829E-3),
515   L(1.072572867311023640958725265762483033769E-1),
516   L(7.790606862409960053675717185714576937994E-1),
517   L(3.016049768232011196434185423512777656328E0),
518   L(5.722963851442769787733717162314477949360E0),
519   L(4.510527838428473279647251350931380867663E0),
520  /* 1.000000000000000000000000000000000000000E0 */
521 };
522 
523 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
524    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
525    Peak relative error 2.1e-35
526    0.25 <= 1/x <= 0.3125  */
527 #define NQ3r2_4N 9
528 static const _Float128 Q3r2_4N[NQ3r2_4N + 1] = {
529   L(-1.087480809271383885936921889040388133627E-8),
530   L(-1.690067828697463740906962973479310170932E-6),
531   L(-9.608064416995105532790745641974762550982E-5),
532   L(-2.594198839156517191858208513873961837410E-3),
533   L(-3.610954144421543968160459863048062977822E-2),
534   L(-2.629866798251843212210482269563961685666E-1),
535   L(-9.709186825881775885917984975685752956660E-1),
536   L(-1.667521829918185121727268867619982417317E0),
537   L(-1.109255082925540057138766105229900943501E0),
538   L(-1.812932453006641348145049323713469043328E-1),
539 };
540 #define NQ3r2_4D 9
541 static const _Float128 Q3r2_4D[NQ3r2_4D + 1] = {
542   L(1.060552717496912381388763753841473407026E-7),
543   L(1.676928002024920520786883649102388708024E-5),
544   L(9.803481712245420839301400601140812255737E-4),
545   L(2.765559874262309494758505158089249012930E-2),
546   L(4.117921827792571791298862613287549140706E-1),
547   L(3.323769515244751267093378361930279161413E0),
548   L(1.436602494405814164724810151689705353670E1),
549   L(3.163087869617098638064881410646782408297E1),
550   L(3.198181264977021649489103980298349589419E1),
551   L(1.203649258862068431199471076202897823272E1),
552  /* 1.000000000000000000000000000000000000000E0  */
553 };
554 
555 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
556    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
557    Peak relative error 1.6e-36
558    0.3125 <= 1/x <= 0.375  */
559 #define NQ2r7_3r2N 9
560 static const _Float128 Q2r7_3r2N[NQ2r7_3r2N + 1] = {
561   L(-1.723405393982209853244278760171643219530E-7),
562   L(-2.090508758514655456365709712333460087442E-5),
563   L(-9.140104013370974823232873472192719263019E-4),
564   L(-1.871349499990714843332742160292474780128E-2),
565   L(-1.948930738119938669637865956162512983416E-1),
566   L(-1.048764684978978127908439526343174139788E0),
567   L(-2.827714929925679500237476105843643064698E0),
568   L(-3.508761569156476114276988181329773987314E0),
569   L(-1.669332202790211090973255098624488308989E0),
570   L(-1.930796319299022954013840684651016077770E-1),
571 };
572 #define NQ2r7_3r2D 9
573 static const _Float128 Q2r7_3r2D[NQ2r7_3r2D + 1] = {
574   L(1.680730662300831976234547482334347983474E-6),
575   L(2.084241442440551016475972218719621841120E-4),
576   L(9.445316642108367479043541702688736295579E-3),
577   L(2.044637889456631896650179477133252184672E-1),
578   L(2.316091982244297350829522534435350078205E0),
579   L(1.412031891783015085196708811890448488865E1),
580   L(4.583830154673223384837091077279595496149E1),
581   L(7.549520609270909439885998474045974122261E1),
582   L(5.697605832808113367197494052388203310638E1),
583   L(1.601496240876192444526383314589371686234E1),
584   /* 1.000000000000000000000000000000000000000E0 */
585 };
586 
587 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
588    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
589    Peak relative error 9.5e-36
590    0.375 <= 1/x <= 0.4375  */
591 #define NQ2r3_2r7N 9
592 static const _Float128 Q2r3_2r7N[NQ2r3_2r7N + 1] = {
593   L(-8.603042076329122085722385914954878953775E-7),
594   L(-7.701746260451647874214968882605186675720E-5),
595   L(-2.407932004380727587382493696877569654271E-3),
596   L(-3.403434217607634279028110636919987224188E-2),
597   L(-2.348707332185238159192422084985713102877E-1),
598   L(-7.957498841538254916147095255700637463207E-1),
599   L(-1.258469078442635106431098063707934348577E0),
600   L(-8.162415474676345812459353639449971369890E-1),
601   L(-1.581783890269379690141513949609572806898E-1),
602   L(-1.890595651683552228232308756569450822905E-3),
603 };
604 #define NQ2r3_2r7D 8
605 static const _Float128 Q2r3_2r7D[NQ2r3_2r7D + 1] = {
606   L(8.390017524798316921170710533381568175665E-6),
607   L(7.738148683730826286477254659973968763659E-4),
608   L(2.541480810958665794368759558791634341779E-2),
609   L(3.878879789711276799058486068562386244873E-1),
610   L(3.003783779325811292142957336802456109333E0),
611   L(1.206480374773322029883039064575464497400E1),
612   L(2.458414064785315978408974662900438351782E1),
613   L(2.367237826273668567199042088835448715228E1),
614   L(9.231451197519171090875569102116321676763E0),
615  /* 1.000000000000000000000000000000000000000E0 */
616 };
617 
618 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
619    Q1(x) = 1/x (.375 + 1/x^2 R(1/x^2)),
620    Peak relative error 1.4e-36
621    0.4375 <= 1/x <= 0.5  */
622 #define NQ2_2r3N 9
623 static const _Float128 Q2_2r3N[NQ2_2r3N + 1] = {
624   L(-5.552507516089087822166822364590806076174E-6),
625   L(-4.135067659799500521040944087433752970297E-4),
626   L(-1.059928728869218962607068840646564457980E-2),
627   L(-1.212070036005832342565792241385459023801E-1),
628   L(-6.688350110633603958684302153362735625156E-1),
629   L(-1.793587878197360221340277951304429821582E0),
630   L(-2.225407682237197485644647380483725045326E0),
631   L(-1.123402135458940189438898496348239744403E0),
632   L(-1.679187241566347077204805190763597299805E-1),
633   L(-1.458550613639093752909985189067233504148E-3),
634 };
635 #define NQ2_2r3D 8
636 static const _Float128 Q2_2r3D[NQ2_2r3D + 1] = {
637   L(5.415024336507980465169023996403597916115E-5),
638   L(4.179246497380453022046357404266022870788E-3),
639   L(1.136306384261959483095442402929502368598E-1),
640   L(1.422640343719842213484515445393284072830E0),
641   L(8.968786703393158374728850922289204805764E0),
642   L(2.914542473339246127533384118781216495934E1),
643   L(4.781605421020380669870197378210457054685E1),
644   L(3.693865837171883152382820584714795072937E1),
645   L(1.153220502744204904763115556224395893076E1),
646   /* 1.000000000000000000000000000000000000000E0 */
647 };
648 
649 
650 /* Evaluate P[n] x^n  +  P[n-1] x^(n-1)  +  ...  +  P[0] */
651 
652 static _Float128
neval(_Float128 x,const _Float128 * p,int n)653 neval (_Float128 x, const _Float128 *p, int n)
654 {
655   _Float128 y;
656 
657   p += n;
658   y = *p--;
659   do
660     {
661       y = y * x + *p--;
662     }
663   while (--n > 0);
664   return y;
665 }
666 
667 
668 /* Evaluate x^n+1  +  P[n] x^(n)  +  P[n-1] x^(n-1)  +  ...  +  P[0] */
669 
670 static _Float128
deval(_Float128 x,const _Float128 * p,int n)671 deval (_Float128 x, const _Float128 *p, int n)
672 {
673   _Float128 y;
674 
675   p += n;
676   y = x + *p--;
677   do
678     {
679       y = y * x + *p--;
680     }
681   while (--n > 0);
682   return y;
683 }
684 
685 
686 /* Bessel function of the first kind, order one.  */
687 
688 _Float128
__ieee754_j1l(_Float128 x)689 __ieee754_j1l (_Float128 x)
690 {
691   _Float128 xx, xinv, z, p, q, c, s, cc, ss;
692 
693   if (! isfinite (x))
694     {
695       if (x != x)
696 	return x + x;
697       else
698 	return 0;
699     }
700   if (x == 0)
701     return x;
702   xx = fabsl (x);
703   if (xx <= L(0x1p-58))
704     {
705       _Float128 ret = x * L(0.5);
706       math_check_force_underflow (ret);
707       if (ret == 0)
708 	__set_errno (ERANGE);
709       return ret;
710     }
711   if (xx <= 2)
712     {
713       /* 0 <= x <= 2 */
714       z = xx * xx;
715       p = xx * z * neval (z, J0_2N, NJ0_2N) / deval (z, J0_2D, NJ0_2D);
716       p += L(0.5) * xx;
717       if (x < 0)
718 	p = -p;
719       return p;
720     }
721 
722   /* X = x - 3 pi/4
723      cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4)
724      = 1/sqrt(2) * (-cos(x) + sin(x))
725      sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4)
726      = -1/sqrt(2) * (sin(x) + cos(x))
727      cf. Fdlibm.  */
728   __sincosl (xx, &s, &c);
729   ss = -s - c;
730   cc = s - c;
731   if (xx <= LDBL_MAX / 2)
732     {
733       z = __cosl (xx + xx);
734       if ((s * c) > 0)
735 	cc = z / ss;
736       else
737 	ss = z / cc;
738     }
739 
740   if (xx > L(0x1p256))
741     {
742       z = ONEOSQPI * cc / sqrtl (xx);
743       if (x < 0)
744 	z = -z;
745       return z;
746     }
747 
748   xinv = 1 / xx;
749   z = xinv * xinv;
750   if (xinv <= 0.25)
751     {
752       if (xinv <= 0.125)
753 	{
754 	  if (xinv <= 0.0625)
755 	    {
756 	      p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID);
757 	      q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID);
758 	    }
759 	  else
760 	    {
761 	      p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D);
762 	      q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D);
763 	    }
764 	}
765       else if (xinv <= 0.1875)
766 	{
767 	  p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D);
768 	  q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D);
769 	}
770       else
771 	{
772 	  p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D);
773 	  q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D);
774 	}
775     }				/* .25 */
776   else /* if (xinv <= 0.5) */
777     {
778       if (xinv <= 0.375)
779 	{
780 	  if (xinv <= 0.3125)
781 	    {
782 	      p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D);
783 	      q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D);
784 	    }
785 	  else
786 	    {
787 	      p = neval (z, P2r7_3r2N, NP2r7_3r2N)
788 		  / deval (z, P2r7_3r2D, NP2r7_3r2D);
789 	      q = neval (z, Q2r7_3r2N, NQ2r7_3r2N)
790 		  / deval (z, Q2r7_3r2D, NQ2r7_3r2D);
791 	    }
792 	}
793       else if (xinv <= 0.4375)
794 	{
795 	  p = neval (z, P2r3_2r7N, NP2r3_2r7N)
796 	      / deval (z, P2r3_2r7D, NP2r3_2r7D);
797 	  q = neval (z, Q2r3_2r7N, NQ2r3_2r7N)
798 	      / deval (z, Q2r3_2r7D, NQ2r3_2r7D);
799 	}
800       else
801 	{
802 	  p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D);
803 	  q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D);
804 	}
805     }
806   p = 1 + z * p;
807   q = z * q;
808   q = q * xinv + L(0.375) * xinv;
809   z = ONEOSQPI * (p * cc - q * ss) / sqrtl (xx);
810   if (x < 0)
811     z = -z;
812   return z;
813 }
814 libm_alias_finite (__ieee754_j1l, __j1l)
815 
816 
817 /* Y1(x) = 2/pi * (log(x) * J1(x) - 1/x) + x R(x^2)
818    Peak relative error 6.2e-38
819    0 <= x <= 2   */
820 #define NY0_2N 7
821 static const _Float128 Y0_2N[NY0_2N + 1] = {
822   L(-6.804415404830253804408698161694720833249E19),
823   L(1.805450517967019908027153056150465849237E19),
824   L(-8.065747497063694098810419456383006737312E17),
825   L(1.401336667383028259295830955439028236299E16),
826   L(-1.171654432898137585000399489686629680230E14),
827   L(5.061267920943853732895341125243428129150E11),
828   L(-1.096677850566094204586208610960870217970E9),
829   L(9.541172044989995856117187515882879304461E5),
830 };
831 #define NY0_2D 7
832 static const _Float128 Y0_2D[NY0_2D + 1] = {
833   L(3.470629591820267059538637461549677594549E20),
834   L(4.120796439009916326855848107545425217219E18),
835   L(2.477653371652018249749350657387030814542E16),
836   L(9.954678543353888958177169349272167762797E13),
837   L(2.957927997613630118216218290262851197754E11),
838   L(6.748421382188864486018861197614025972118E8),
839   L(1.173453425218010888004562071020305709319E6),
840   L(1.450335662961034949894009554536003377187E3),
841   /* 1.000000000000000000000000000000000000000E0 */
842 };
843 
844 
845 /* Bessel function of the second kind, order one.  */
846 
847 _Float128
__ieee754_y1l(_Float128 x)848 __ieee754_y1l (_Float128 x)
849 {
850   _Float128 xx, xinv, z, p, q, c, s, cc, ss;
851 
852   if (! isfinite (x))
853     return 1 / (x + x * x);
854   if (x <= 0)
855     {
856       if (x < 0)
857 	return (zero / (zero * x));
858       return -1 / zero; /* -inf and divide by zero exception.  */
859     }
860   xx = fabsl (x);
861   if (xx <= 0x1p-114)
862     {
863       z = -TWOOPI / x;
864       if (isinf (z))
865 	__set_errno (ERANGE);
866       return z;
867     }
868   if (xx <= 2)
869     {
870       /* 0 <= x <= 2 */
871       SET_RESTORE_ROUNDL (FE_TONEAREST);
872       z = xx * xx;
873       p = xx * neval (z, Y0_2N, NY0_2N) / deval (z, Y0_2D, NY0_2D);
874       p = -TWOOPI / xx + p;
875       p = TWOOPI * __ieee754_logl (x) * __ieee754_j1l (x) + p;
876       return p;
877     }
878 
879   /* X = x - 3 pi/4
880      cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4)
881      = 1/sqrt(2) * (-cos(x) + sin(x))
882      sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4)
883      = -1/sqrt(2) * (sin(x) + cos(x))
884      cf. Fdlibm.  */
885   __sincosl (xx, &s, &c);
886   ss = -s - c;
887   cc = s - c;
888   if (xx <= LDBL_MAX / 2)
889     {
890       z = __cosl (xx + xx);
891       if ((s * c) > 0)
892 	cc = z / ss;
893       else
894 	ss = z / cc;
895     }
896 
897   if (xx > L(0x1p256))
898     return ONEOSQPI * ss / sqrtl (xx);
899 
900   xinv = 1 / xx;
901   z = xinv * xinv;
902   if (xinv <= 0.25)
903     {
904       if (xinv <= 0.125)
905 	{
906 	  if (xinv <= 0.0625)
907 	    {
908 	      p = neval (z, P16_IN, NP16_IN) / deval (z, P16_ID, NP16_ID);
909 	      q = neval (z, Q16_IN, NQ16_IN) / deval (z, Q16_ID, NQ16_ID);
910 	    }
911 	  else
912 	    {
913 	      p = neval (z, P8_16N, NP8_16N) / deval (z, P8_16D, NP8_16D);
914 	      q = neval (z, Q8_16N, NQ8_16N) / deval (z, Q8_16D, NQ8_16D);
915 	    }
916 	}
917       else if (xinv <= 0.1875)
918 	{
919 	  p = neval (z, P5_8N, NP5_8N) / deval (z, P5_8D, NP5_8D);
920 	  q = neval (z, Q5_8N, NQ5_8N) / deval (z, Q5_8D, NQ5_8D);
921 	}
922       else
923 	{
924 	  p = neval (z, P4_5N, NP4_5N) / deval (z, P4_5D, NP4_5D);
925 	  q = neval (z, Q4_5N, NQ4_5N) / deval (z, Q4_5D, NQ4_5D);
926 	}
927     }				/* .25 */
928   else /* if (xinv <= 0.5) */
929     {
930       if (xinv <= 0.375)
931 	{
932 	  if (xinv <= 0.3125)
933 	    {
934 	      p = neval (z, P3r2_4N, NP3r2_4N) / deval (z, P3r2_4D, NP3r2_4D);
935 	      q = neval (z, Q3r2_4N, NQ3r2_4N) / deval (z, Q3r2_4D, NQ3r2_4D);
936 	    }
937 	  else
938 	    {
939 	      p = neval (z, P2r7_3r2N, NP2r7_3r2N)
940 		  / deval (z, P2r7_3r2D, NP2r7_3r2D);
941 	      q = neval (z, Q2r7_3r2N, NQ2r7_3r2N)
942 		  / deval (z, Q2r7_3r2D, NQ2r7_3r2D);
943 	    }
944 	}
945       else if (xinv <= 0.4375)
946 	{
947 	  p = neval (z, P2r3_2r7N, NP2r3_2r7N)
948 	      / deval (z, P2r3_2r7D, NP2r3_2r7D);
949 	  q = neval (z, Q2r3_2r7N, NQ2r3_2r7N)
950 	      / deval (z, Q2r3_2r7D, NQ2r3_2r7D);
951 	}
952       else
953 	{
954 	  p = neval (z, P2_2r3N, NP2_2r3N) / deval (z, P2_2r3D, NP2_2r3D);
955 	  q = neval (z, Q2_2r3N, NQ2_2r3N) / deval (z, Q2_2r3D, NQ2_2r3D);
956 	}
957     }
958   p = 1 + z * p;
959   q = z * q;
960   q = q * xinv + L(0.375) * xinv;
961   z = ONEOSQPI * (p * ss + q * cc) / sqrtl (xx);
962   return z;
963 }
964 libm_alias_finite (__ieee754_y1l, __y1l)
965