1 /*
2  * ====================================================
3  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4  *
5  * Developed at SunPro, a Sun Microsystems, Inc. business.
6  * Permission to use, copy, modify, and distribute this
7  * software is freely granted, provided that this notice
8  * is preserved.
9  * ====================================================
10  */
11 
12 /* Long double expansions are
13   Copyright (C) 2001 Stephen L. Moshier <moshier@na-net.ornl.gov>
14   and are incorporated herein by permission of the author.  The author
15   reserves the right to distribute this material elsewhere under different
16   copying permissions.  These modifications are distributed here under
17   the following terms:
18 
19     This library is free software; you can redistribute it and/or
20     modify it under the terms of the GNU Lesser General Public
21     License as published by the Free Software Foundation; either
22     version 2.1 of the License, or (at your option) any later version.
23 
24     This library is distributed in the hope that it will be useful,
25     but WITHOUT ANY WARRANTY; without even the implied warranty of
26     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27     Lesser General Public License for more details.
28 
29     You should have received a copy of the GNU Lesser General Public
30     License along with this library; if not, see
31     <https://www.gnu.org/licenses/>.  */
32 
33 /* __ieee754_j1(x), __ieee754_y1(x)
34  * Bessel function of the first and second kinds of order zero.
35  * Method -- j1(x):
36  *	1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ...
37  *	2. Reduce x to |x| since j1(x)=-j1(-x),  and
38  *	   for x in (0,2)
39  *		j1(x) = x/2 + x*z*R0/S0,  where z = x*x;
40  *	   for x in (2,inf)
41  *		j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
42  *		y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
43  *	   where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
44  *	   as follow:
45  *		cos(x1) =  cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
46  *			=  1/sqrt(2) * (sin(x) - cos(x))
47  *		sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
48  *			= -1/sqrt(2) * (sin(x) + cos(x))
49  *	   (To avoid cancellation, use
50  *		sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
51  *	    to compute the worse one.)
52  *
53  *	3 Special cases
54  *		j1(nan)= nan
55  *		j1(0) = 0
56  *		j1(inf) = 0
57  *
58  * Method -- y1(x):
59  *	1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
60  *	2. For x<2.
61  *	   Since
62  *		y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...)
63  *	   therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
64  *	   We use the following function to approximate y1,
65  *		y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2
66  *	   Note: For tiny x, 1/x dominate y1 and hence
67  *		y1(tiny) = -2/pi/tiny
68  *	3. For x>=2.
69  *		y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
70  *	   where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
71  *	   by method mentioned above.
72  */
73 
74 #include <errno.h>
75 #include <float.h>
76 #include <math.h>
77 #include <math_private.h>
78 #include <math-underflow.h>
79 #include <libm-alias-finite.h>
80 
81 static long double pone (long double), qone (long double);
82 
83 static const long double
84   huge = 1e4930L,
85  one = 1.0L,
86  invsqrtpi = 5.6418958354775628694807945156077258584405e-1L,
87   tpi =  6.3661977236758134307553505349005744813784e-1L,
88 
89   /* J1(x) = .5 x + x x^2 R(x^2) / S(x^2)
90      0 <= x <= 2
91      Peak relative error 4.5e-21 */
92 R[5] = {
93     -9.647406112428107954753770469290757756814E7L,
94     2.686288565865230690166454005558203955564E6L,
95     -3.689682683905671185891885948692283776081E4L,
96     2.195031194229176602851429567792676658146E2L,
97     -5.124499848728030297902028238597308971319E-1L,
98 },
99 
100   S[4] =
101 {
102   1.543584977988497274437410333029029035089E9L,
103   2.133542369567701244002565983150952549520E7L,
104   1.394077011298227346483732156167414670520E5L,
105   5.252401789085732428842871556112108446506E2L,
106   /*  1.000000000000000000000000000000000000000E0L, */
107 };
108 
109 static const long double zero = 0.0;
110 
111 
112 long double
__ieee754_j1l(long double x)113 __ieee754_j1l (long double x)
114 {
115   long double z, c, r, s, ss, cc, u, v, y;
116   int32_t ix;
117   uint32_t se;
118 
119   GET_LDOUBLE_EXP (se, x);
120   ix = se & 0x7fff;
121   if (__glibc_unlikely (ix >= 0x7fff))
122     return one / x;
123   y = fabsl (x);
124   if (ix >= 0x4000)
125     {				/* |x| >= 2.0 */
126       __sincosl (y, &s, &c);
127       ss = -s - c;
128       cc = s - c;
129       if (ix < 0x7ffe)
130 	{			/* make sure y+y not overflow */
131 	  z = __cosl (y + y);
132 	  if ((s * c) > zero)
133 	    cc = z / ss;
134 	  else
135 	    ss = z / cc;
136 	}
137       /*
138        * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
139        * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
140        */
141       if (__glibc_unlikely (ix > 0x408e))
142 	z = (invsqrtpi * cc) / sqrtl (y);
143       else
144 	{
145 	  u = pone (y);
146 	  v = qone (y);
147 	  z = invsqrtpi * (u * cc - v * ss) / sqrtl (y);
148 	}
149       if (se & 0x8000)
150 	return -z;
151       else
152 	return z;
153     }
154   if (__glibc_unlikely (ix < 0x3fde))       /* |x| < 2^-33 */
155     {
156       if (huge + x > one)		/* inexact if x!=0 necessary */
157 	{
158 	  long double ret = 0.5 * x;
159 	  math_check_force_underflow (ret);
160 	  if (ret == 0 && x != 0)
161 	    __set_errno (ERANGE);
162 	  return ret;
163 	}
164     }
165   z = x * x;
166   r = z * (R[0] + z * (R[1]+ z * (R[2] + z * (R[3] + z * R[4]))));
167   s = S[0] + z * (S[1] + z * (S[2] + z * (S[3] + z)));
168   r *= x;
169   return (x * 0.5 + r / s);
170 }
171 libm_alias_finite (__ieee754_j1l, __j1l)
172 
173 
174 /* Y1(x) = 2/pi * (log(x) * j1(x) - 1/x) + x R(x^2)
175    0 <= x <= 2
176    Peak relative error 2.3e-23 */
177 static const long double U0[6] = {
178   -5.908077186259914699178903164682444848615E10L,
179   1.546219327181478013495975514375773435962E10L,
180   -6.438303331169223128870035584107053228235E8L,
181   9.708540045657182600665968063824819371216E6L,
182   -6.138043997084355564619377183564196265471E4L,
183   1.418503228220927321096904291501161800215E2L,
184 };
185 static const long double V0[5] = {
186   3.013447341682896694781964795373783679861E11L,
187   4.669546565705981649470005402243136124523E9L,
188   3.595056091631351184676890179233695857260E7L,
189   1.761554028569108722903944659933744317994E5L,
190   5.668480419646516568875555062047234534863E2L,
191   /*  1.000000000000000000000000000000000000000E0L, */
192 };
193 
194 
195 long double
__ieee754_y1l(long double x)196 __ieee754_y1l (long double x)
197 {
198   long double z, s, c, ss, cc, u, v;
199   int32_t ix;
200   uint32_t se, i0, i1;
201 
202   GET_LDOUBLE_WORDS (se, i0, i1, x);
203   ix = se & 0x7fff;
204   /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
205   if (__glibc_unlikely (se & 0x8000))
206     return zero / (zero * x);
207   if (__glibc_unlikely (ix >= 0x7fff))
208     return one / (x + x * x);
209   if (__glibc_unlikely ((i0 | i1) == 0))
210     return -HUGE_VALL + x;  /* -inf and overflow exception.  */
211   if (ix >= 0x4000)
212     {				/* |x| >= 2.0 */
213       __sincosl (x, &s, &c);
214       ss = -s - c;
215       cc = s - c;
216       if (ix < 0x7ffe)
217 	{			/* make sure x+x not overflow */
218 	  z = __cosl (x + x);
219 	  if ((s * c) > zero)
220 	    cc = z / ss;
221 	  else
222 	    ss = z / cc;
223 	}
224       /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
225        * where x0 = x-3pi/4
226        *      Better formula:
227        *              cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
228        *                      =  1/sqrt(2) * (sin(x) - cos(x))
229        *              sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
230        *                      = -1/sqrt(2) * (cos(x) + sin(x))
231        * To avoid cancellation, use
232        *              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
233        * to compute the worse one.
234        */
235       if (__glibc_unlikely (ix > 0x408e))
236 	z = (invsqrtpi * ss) / sqrtl (x);
237       else
238 	{
239 	  u = pone (x);
240 	  v = qone (x);
241 	  z = invsqrtpi * (u * ss + v * cc) / sqrtl (x);
242 	}
243       return z;
244     }
245   if (__glibc_unlikely (ix <= 0x3fbe))
246     {				/* x < 2**-65 */
247       z = -tpi / x;
248       if (isinf (z))
249 	__set_errno (ERANGE);
250       return z;
251     }
252   z = x * x;
253  u = U0[0] + z * (U0[1] + z * (U0[2] + z * (U0[3] + z * (U0[4] + z * U0[5]))));
254  v = V0[0] + z * (V0[1] + z * (V0[2] + z * (V0[3] + z * (V0[4] + z))));
255   return (x * (u / v) +
256 	  tpi * (__ieee754_j1l (x) * __ieee754_logl (x) - one / x));
257 }
258 libm_alias_finite (__ieee754_y1l, __y1l)
259 
260 
261 /* For x >= 8, the asymptotic expansions of pone is
262  *	1 + 15/128 s^2 - 4725/2^15 s^4 - ...,	where s = 1/x.
263  * We approximate pone by
264  *	pone(x) = 1 + (R/S)
265  */
266 
267 /* J1(x) cosX + Y1(x) sinX  =  sqrt( 2/(pi x)) P1(x)
268    P1(x) = 1 + z^2 R(z^2), z=1/x
269    8 <= x <= inf  (0 <= z <= 0.125)
270    Peak relative error 5.2e-22  */
271 
272 static const long double pr8[7] = {
273   8.402048819032978959298664869941375143163E-9L,
274   1.813743245316438056192649247507255996036E-6L,
275   1.260704554112906152344932388588243836276E-4L,
276   3.439294839869103014614229832700986965110E-3L,
277   3.576910849712074184504430254290179501209E-2L,
278   1.131111483254318243139953003461511308672E-1L,
279   4.480715825681029711521286449131671880953E-2L,
280 };
281 static const long double ps8[6] = {
282   7.169748325574809484893888315707824924354E-8L,
283   1.556549720596672576431813934184403614817E-5L,
284   1.094540125521337139209062035774174565882E-3L,
285   3.060978962596642798560894375281428805840E-2L,
286   3.374146536087205506032643098619414507024E-1L,
287   1.253830208588979001991901126393231302559E0L,
288   /* 1.000000000000000000000000000000000000000E0L, */
289 };
290 
291 /* J1(x) cosX + Y1(x) sinX  =  sqrt( 2/(pi x)) P1(x)
292    P1(x) = 1 + z^2 R(z^2), z=1/x
293    4.54541015625 <= x <= 8
294    Peak relative error 7.7e-22  */
295 static const long double pr5[7] = {
296   4.318486887948814529950980396300969247900E-7L,
297   4.715341880798817230333360497524173929315E-5L,
298   1.642719430496086618401091544113220340094E-3L,
299   2.228688005300803935928733750456396149104E-2L,
300   1.142773760804150921573259605730018327162E-1L,
301   1.755576530055079253910829652698703791957E-1L,
302   3.218803858282095929559165965353784980613E-2L,
303 };
304 static const long double ps5[6] = {
305   3.685108812227721334719884358034713967557E-6L,
306   4.069102509511177498808856515005792027639E-4L,
307   1.449728676496155025507893322405597039816E-2L,
308   2.058869213229520086582695850441194363103E-1L,
309   1.164890985918737148968424972072751066553E0L,
310   2.274776933457009446573027260373361586841E0L,
311   /*  1.000000000000000000000000000000000000000E0L,*/
312 };
313 
314 /* J1(x) cosX + Y1(x) sinX  =  sqrt( 2/(pi x)) P1(x)
315    P1(x) = 1 + z^2 R(z^2), z=1/x
316    2.85711669921875 <= x <= 4.54541015625
317    Peak relative error 6.5e-21  */
318 static const long double pr3[7] = {
319   1.265251153957366716825382654273326407972E-5L,
320   8.031057269201324914127680782288352574567E-4L,
321   1.581648121115028333661412169396282881035E-2L,
322   1.179534658087796321928362981518645033967E-1L,
323   3.227936912780465219246440724502790727866E-1L,
324   2.559223765418386621748404398017602935764E-1L,
325   2.277136933287817911091370397134882441046E-2L,
326 };
327 static const long double ps3[6] = {
328   1.079681071833391818661952793568345057548E-4L,
329   6.986017817100477138417481463810841529026E-3L,
330   1.429403701146942509913198539100230540503E-1L,
331   1.148392024337075609460312658938700765074E0L,
332   3.643663015091248720208251490291968840882E0L,
333   3.990702269032018282145100741746633960737E0L,
334   /* 1.000000000000000000000000000000000000000E0L, */
335 };
336 
337 /* J1(x) cosX + Y1(x) sinX  =  sqrt( 2/(pi x)) P1(x)
338    P1(x) = 1 + z^2 R(z^2), z=1/x
339    2 <= x <= 2.85711669921875
340    Peak relative error 3.5e-21  */
341 static const long double pr2[7] = {
342   2.795623248568412225239401141338714516445E-4L,
343   1.092578168441856711925254839815430061135E-2L,
344   1.278024620468953761154963591853679640560E-1L,
345   5.469680473691500673112904286228351988583E-1L,
346   8.313769490922351300461498619045639016059E-1L,
347   3.544176317308370086415403567097130611468E-1L,
348   1.604142674802373041247957048801599740644E-2L,
349 };
350 static const long double ps2[6] = {
351   2.385605161555183386205027000675875235980E-3L,
352   9.616778294482695283928617708206967248579E-2L,
353   1.195215570959693572089824415393951258510E0L,
354   5.718412857897054829999458736064922974662E0L,
355   1.065626298505499086386584642761602177568E1L,
356   6.809140730053382188468983548092322151791E0L,
357  /* 1.000000000000000000000000000000000000000E0L, */
358 };
359 
360 
361 static long double
pone(long double x)362 pone (long double x)
363 {
364   const long double *p, *q;
365   long double z, r, s;
366   int32_t ix;
367   uint32_t se, i0, i1;
368 
369   GET_LDOUBLE_WORDS (se, i0, i1, x);
370   ix = se & 0x7fff;
371   /* ix >= 0x4000 for all calls to this function.  */
372   if (ix >= 0x4002) /* x >= 8 */
373     {
374       p = pr8;
375       q = ps8;
376     }
377   else
378     {
379       i1 = (ix << 16) | (i0 >> 16);
380       if (i1 >= 0x40019174)	/* x >= 4.54541015625 */
381 	{
382 	  p = pr5;
383 	  q = ps5;
384 	}
385       else if (i1 >= 0x4000b6db)	/* x >= 2.85711669921875 */
386 	{
387 	  p = pr3;
388 	  q = ps3;
389 	}
390       else	/* x >= 2 */
391 	{
392 	  p = pr2;
393 	  q = ps2;
394 	}
395     }
396   z = one / (x * x);
397  r = p[0] + z * (p[1] +
398 		 z * (p[2] + z * (p[3] + z * (p[4] + z * (p[5] + z * p[6])))));
399  s = q[0] + z * (q[1] + z * (q[2] + z * (q[3] + z * (q[4] + z * (q[5] + z)))));
400   return one + z * r / s;
401 }
402 
403 
404 /* For x >= 8, the asymptotic expansions of qone is
405  *	3/8 s - 105/1024 s^3 - ..., where s = 1/x.
406  * We approximate pone by
407  *	qone(x) = s*(0.375 + (R/S))
408  */
409 
410 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
411    Q1(x) = z(.375 + z^2 R(z^2)), z=1/x
412    8 <= x <= inf
413    Peak relative error 8.3e-22 */
414 
415 static const long double qr8[7] = {
416   -5.691925079044209246015366919809404457380E-10L,
417   -1.632587664706999307871963065396218379137E-7L,
418   -1.577424682764651970003637263552027114600E-5L,
419   -6.377627959241053914770158336842725291713E-4L,
420   -1.087408516779972735197277149494929568768E-2L,
421   -6.854943629378084419631926076882330494217E-2L,
422   -1.055448290469180032312893377152490183203E-1L,
423 };
424 static const long double qs8[7] = {
425   5.550982172325019811119223916998393907513E-9L,
426   1.607188366646736068460131091130644192244E-6L,
427   1.580792530091386496626494138334505893599E-4L,
428   6.617859900815747303032860443855006056595E-3L,
429   1.212840547336984859952597488863037659161E-1L,
430   9.017885953937234900458186716154005541075E-1L,
431   2.201114489712243262000939120146436167178E0L,
432   /* 1.000000000000000000000000000000000000000E0L, */
433 };
434 
435 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
436    Q1(x) = z(.375 + z^2 R(z^2)), z=1/x
437    4.54541015625 <= x <= 8
438    Peak relative error 4.1e-22 */
439 static const long double qr5[7] = {
440   -6.719134139179190546324213696633564965983E-8L,
441   -9.467871458774950479909851595678622044140E-6L,
442   -4.429341875348286176950914275723051452838E-4L,
443   -8.539898021757342531563866270278505014487E-3L,
444   -6.818691805848737010422337101409276287170E-2L,
445   -1.964432669771684034858848142418228214855E-1L,
446   -1.333896496989238600119596538299938520726E-1L,
447 };
448 static const long double qs5[7] = {
449   6.552755584474634766937589285426911075101E-7L,
450   9.410814032118155978663509073200494000589E-5L,
451   4.561677087286518359461609153655021253238E-3L,
452   9.397742096177905170800336715661091535805E-2L,
453   8.518538116671013902180962914473967738771E-1L,
454   3.177729183645800174212539541058292579009E0L,
455   4.006745668510308096259753538973038902990E0L,
456   /* 1.000000000000000000000000000000000000000E0L, */
457 };
458 
459 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
460    Q1(x) = z(.375 + z^2 R(z^2)), z=1/x
461    2.85711669921875 <= x <= 4.54541015625
462    Peak relative error 2.2e-21 */
463 static const long double qr3[7] = {
464   -3.618746299358445926506719188614570588404E-6L,
465   -2.951146018465419674063882650970344502798E-4L,
466   -7.728518171262562194043409753656506795258E-3L,
467   -8.058010968753999435006488158237984014883E-2L,
468   -3.356232856677966691703904770937143483472E-1L,
469   -4.858192581793118040782557808823460276452E-1L,
470   -1.592399251246473643510898335746432479373E-1L,
471 };
472 static const long double qs3[7] = {
473   3.529139957987837084554591421329876744262E-5L,
474   2.973602667215766676998703687065066180115E-3L,
475   8.273534546240864308494062287908662592100E-2L,
476   9.613359842126507198241321110649974032726E-1L,
477   4.853923697093974370118387947065402707519E0L,
478   1.002671608961669247462020977417828796933E1L,
479   7.028927383922483728931327850683151410267E0L,
480   /* 1.000000000000000000000000000000000000000E0L, */
481 };
482 
483 /* Y1(x)cosX - J1(x)sinX = sqrt( 2/(pi x)) Q1(x),
484    Q1(x) = z(.375 + z^2 R(z^2)), z=1/x
485    2 <= x <= 2.85711669921875
486    Peak relative error 6.9e-22 */
487 static const long double qr2[7] = {
488   -1.372751603025230017220666013816502528318E-4L,
489   -6.879190253347766576229143006767218972834E-3L,
490   -1.061253572090925414598304855316280077828E-1L,
491   -6.262164224345471241219408329354943337214E-1L,
492   -1.423149636514768476376254324731437473915E0L,
493   -1.087955310491078933531734062917489870754E0L,
494   -1.826821119773182847861406108689273719137E-1L,
495 };
496 static const long double qs2[7] = {
497   1.338768933634451601814048220627185324007E-3L,
498   7.071099998918497559736318523932241901810E-2L,
499   1.200511429784048632105295629933382142221E0L,
500   8.327301713640367079030141077172031825276E0L,
501   2.468479301872299311658145549931764426840E1L,
502   2.961179686096262083509383820557051621644E1L,
503   1.201402313144305153005639494661767354977E1L,
504  /* 1.000000000000000000000000000000000000000E0L, */
505 };
506 
507 
508 static long double
qone(long double x)509 qone (long double x)
510 {
511   const long double *p, *q;
512   long double s, r, z;
513   int32_t ix;
514   uint32_t se, i0, i1;
515 
516   GET_LDOUBLE_WORDS (se, i0, i1, x);
517   ix = se & 0x7fff;
518   /* ix >= 0x4000 for all calls to this function.  */
519   if (ix >= 0x4002)		/* x >= 8 */
520     {
521       p = qr8;
522       q = qs8;
523     }
524   else
525     {
526       i1 = (ix << 16) | (i0 >> 16);
527       if (i1 >= 0x40019174)	/* x >= 4.54541015625 */
528 	{
529 	  p = qr5;
530 	  q = qs5;
531 	}
532       else if (i1 >= 0x4000b6db)	/* x >= 2.85711669921875 */
533 	{
534 	  p = qr3;
535 	  q = qs3;
536 	}
537       else	/* x >= 2 */
538 	{
539 	  p = qr2;
540 	  q = qs2;
541 	}
542     }
543   z = one / (x * x);
544   r =
545     p[0] + z * (p[1] +
546 		z * (p[2] + z * (p[3] + z * (p[4] + z * (p[5] + z * p[6])))));
547   s =
548     q[0] + z * (q[1] +
549 		z * (q[2] +
550 		     z * (q[3] + z * (q[4] + z * (q[5] + z * (q[6] + z))))));
551   return (.375 + z * r / s) / x;
552 }
553