1*1e651e1eSRoland Levillain 2*1e651e1eSRoland Levillain /* @(#)w_jn.c 1.3 95/01/18 */ 3*1e651e1eSRoland Levillain /* 4*1e651e1eSRoland Levillain * ==================================================== 5*1e651e1eSRoland Levillain * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6*1e651e1eSRoland Levillain * 7*1e651e1eSRoland Levillain * Developed at SunSoft, a Sun Microsystems, Inc. business. 8*1e651e1eSRoland Levillain * Permission to use, copy, modify, and distribute this 9*1e651e1eSRoland Levillain * software is freely granted, provided that this notice 10*1e651e1eSRoland Levillain * is preserved. 11*1e651e1eSRoland Levillain * ==================================================== 12*1e651e1eSRoland Levillain */ 13*1e651e1eSRoland Levillain 14*1e651e1eSRoland Levillain /* 15*1e651e1eSRoland Levillain * wrapper ieee_jn(int n, double x), ieee_yn(int n, double x) 16*1e651e1eSRoland Levillain * floating point Bessel's function of the 1st and 2nd kind 17*1e651e1eSRoland Levillain * of order n 18*1e651e1eSRoland Levillain * 19*1e651e1eSRoland Levillain * Special cases: 20*1e651e1eSRoland Levillain * y0(0)=ieee_y1(0)=ieee_yn(n,0) = -inf with division by zero signal; 21*1e651e1eSRoland Levillain * y0(-ve)=ieee_y1(-ve)=ieee_yn(n,-ve) are NaN with invalid signal. 22*1e651e1eSRoland Levillain * Note 2. About ieee_jn(n,x), ieee_yn(n,x) 23*1e651e1eSRoland Levillain * For n=0, ieee_j0(x) is called, 24*1e651e1eSRoland Levillain * for n=1, ieee_j1(x) is called, 25*1e651e1eSRoland Levillain * for n<x, forward recursion us used starting 26*1e651e1eSRoland Levillain * from values of ieee_j0(x) and ieee_j1(x). 27*1e651e1eSRoland Levillain * for n>x, a continued fraction approximation to 28*1e651e1eSRoland Levillain * j(n,x)/j(n-1,x) is evaluated and then backward 29*1e651e1eSRoland Levillain * recursion is used starting from a supposed value 30*1e651e1eSRoland Levillain * for j(n,x). The resulting value of j(0,x) is 31*1e651e1eSRoland Levillain * compared with the actual value to correct the 32*1e651e1eSRoland Levillain * supposed value of j(n,x). 33*1e651e1eSRoland Levillain * 34*1e651e1eSRoland Levillain * yn(n,x) is similar in all respects, except 35*1e651e1eSRoland Levillain * that forward recursion is used for all 36*1e651e1eSRoland Levillain * values of n>1. 37*1e651e1eSRoland Levillain * 38*1e651e1eSRoland Levillain */ 39*1e651e1eSRoland Levillain 40*1e651e1eSRoland Levillain #include "fdlibm.h" 41*1e651e1eSRoland Levillain 42*1e651e1eSRoland Levillain #ifdef __STDC__ ieee_jn(int n,double x)43*1e651e1eSRoland Levillain double ieee_jn(int n, double x) /* wrapper jn */ 44*1e651e1eSRoland Levillain #else 45*1e651e1eSRoland Levillain double ieee_jn(n,x) /* wrapper jn */ 46*1e651e1eSRoland Levillain double x; int n; 47*1e651e1eSRoland Levillain #endif 48*1e651e1eSRoland Levillain { 49*1e651e1eSRoland Levillain #ifdef _IEEE_LIBM 50*1e651e1eSRoland Levillain return __ieee754_jn(n,x); 51*1e651e1eSRoland Levillain #else 52*1e651e1eSRoland Levillain double z; 53*1e651e1eSRoland Levillain z = __ieee754_jn(n,x); 54*1e651e1eSRoland Levillain if(_LIB_VERSION == _IEEE_ || ieee_isnan(x) ) return z; 55*1e651e1eSRoland Levillain if(ieee_fabs(x)>X_TLOSS) { 56*1e651e1eSRoland Levillain return __kernel_standard((double)n,x,38); /* ieee_jn(|x|>X_TLOSS,n) */ 57*1e651e1eSRoland Levillain } else 58*1e651e1eSRoland Levillain return z; 59*1e651e1eSRoland Levillain #endif 60*1e651e1eSRoland Levillain } 61*1e651e1eSRoland Levillain 62*1e651e1eSRoland Levillain #ifdef __STDC__ ieee_yn(int n,double x)63*1e651e1eSRoland Levillain double ieee_yn(int n, double x) /* wrapper yn */ 64*1e651e1eSRoland Levillain #else 65*1e651e1eSRoland Levillain double ieee_yn(n,x) /* wrapper yn */ 66*1e651e1eSRoland Levillain double x; int n; 67*1e651e1eSRoland Levillain #endif 68*1e651e1eSRoland Levillain { 69*1e651e1eSRoland Levillain #ifdef _IEEE_LIBM 70*1e651e1eSRoland Levillain return __ieee754_yn(n,x); 71*1e651e1eSRoland Levillain #else 72*1e651e1eSRoland Levillain double z; 73*1e651e1eSRoland Levillain z = __ieee754_yn(n,x); 74*1e651e1eSRoland Levillain if(_LIB_VERSION == _IEEE_ || ieee_isnan(x) ) return z; 75*1e651e1eSRoland Levillain if(x <= 0.0){ 76*1e651e1eSRoland Levillain if(x==0.0) 77*1e651e1eSRoland Levillain /* d= -one/(x-x); */ 78*1e651e1eSRoland Levillain return __kernel_standard((double)n,x,12); 79*1e651e1eSRoland Levillain else 80*1e651e1eSRoland Levillain /* d = zero/(x-x); */ 81*1e651e1eSRoland Levillain return __kernel_standard((double)n,x,13); 82*1e651e1eSRoland Levillain } 83*1e651e1eSRoland Levillain if(x>X_TLOSS) { 84*1e651e1eSRoland Levillain return __kernel_standard((double)n,x,39); /* ieee_yn(x>X_TLOSS,n) */ 85*1e651e1eSRoland Levillain } else 86*1e651e1eSRoland Levillain return z; 87*1e651e1eSRoland Levillain #endif 88*1e651e1eSRoland Levillain } 89