
/* @(#)w_jn.c 1.3 95/01/18 */
/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice 
 * is preserved.
 * ====================================================
 */

/*
 * wrapper ieee_jn(int n, double x), ieee_yn(int n, double x)
 * floating point Bessel's function of the 1st and 2nd kind
 * of order n
 *          
 * Special cases:
 *	y0(0)=ieee_y1(0)=ieee_yn(n,0) = -inf with division by zero signal;
 *	y0(-ve)=ieee_y1(-ve)=ieee_yn(n,-ve) are NaN with invalid signal.
 * Note 2. About ieee_jn(n,x), ieee_yn(n,x)
 *	For n=0, ieee_j0(x) is called,
 *	for n=1, ieee_j1(x) is called,
 *	for n<x, forward recursion us used starting
 *	from values of ieee_j0(x) and ieee_j1(x).
 *	for n>x, a continued fraction approximation to
 *	j(n,x)/j(n-1,x) is evaluated and then backward
 *	recursion is used starting from a supposed value
 *	for j(n,x). The resulting value of j(0,x) is
 *	compared with the actual value to correct the
 *	supposed value of j(n,x).
 *
 *	yn(n,x) is similar in all respects, except
 *	that forward recursion is used for all
 *	values of n>1.
 *	
 */

#include "fdlibm.h"

#ifdef __STDC__
	double ieee_jn(int n, double x)	/* wrapper jn */
#else
	double ieee_jn(n,x)			/* wrapper jn */
	double x; int n;
#endif
{
#ifdef _IEEE_LIBM
	return __ieee754_jn(n,x);
#else
	double z;
	z = __ieee754_jn(n,x);
	if(_LIB_VERSION == _IEEE_ || ieee_isnan(x) ) return z;
	if(ieee_fabs(x)>X_TLOSS) {
	    return __kernel_standard((double)n,x,38); /* ieee_jn(|x|>X_TLOSS,n) */
	} else
	    return z;
#endif
}

#ifdef __STDC__
	double ieee_yn(int n, double x)	/* wrapper yn */
#else
	double ieee_yn(n,x)			/* wrapper yn */
	double x; int n;
#endif
{
#ifdef _IEEE_LIBM
	return __ieee754_yn(n,x);
#else
	double z;
	z = __ieee754_yn(n,x);
	if(_LIB_VERSION == _IEEE_ || ieee_isnan(x) ) return z;
        if(x <= 0.0){
                if(x==0.0)
                    /* d= -one/(x-x); */
                    return __kernel_standard((double)n,x,12);
                else
                    /* d = zero/(x-x); */
                    return __kernel_standard((double)n,x,13);
        }
	if(x>X_TLOSS) {
	    return __kernel_standard((double)n,x,39); /* ieee_yn(x>X_TLOSS,n) */
	} else
	    return z;
#endif
}
