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