Sindbad~EG File Manager

Current Path : /usr/home/beeson/Otter-Lambda/yyy/deval/
Upload File :
Current File : /usr/home/beeson/Otter-Lambda/yyy/deval/modbes.c

/* Numerical Recipes code for modified Bessel functions Kn and In */
/* 11.23.91 imported code, with changed prototypes and error handling */
/* 1.7.96 changed 'int j' to 'unsigned j' two places to eliminate
   warning messages in VC */

#include <math.h>
#include <assert.h>

double k0(double);
double k1(double);
double bessk(unsigned, double);
double i0(double);
double i1(double);
double bessi(unsigned, double);

/*______________________________________________________________________*/
double bessk(unsigned n, double x)
{
   unsigned j;
   double bk,bkm,bkp,tox;
   assert(n >= 2);
   tox=2.0/x;
   bkm=k0(x);
   bk=k1(x);
   for (j=1;j<n;j++)
     { bkp=bkm+j*tox*bk;
       bkm=bk;
       bk=bkp;
    }
  return bk;
}

double k0(double x)
{
  double y,ans;
   if (x <= 2.0)
     { y=x*x/4.0;
       ans=(-log(x/2.0)*i0(x))+(-0.57721566+y*(0.42278420
           +y*(0.23069756+y*(0.3488590e-1+y*(0.262698e-2
           +y*(0.10750e-3+y*0.74e-5))))));
     }
   else
     { y=2.0/x;
       ans=(exp(-x)/sqrt(x))*(1.25331414+y*(-0.7832358e-1
           +y*(0.2189568e-1+y*(-0.1062446e-1+y*(0.587872e-2
           +y*(-0.251540e-2+y*0.53208e-3))))));
     }
  return ans;
}

/*__________________________________________________________*/
double k1(double x)
{  double y,ans;
   if (x <= 2.0)
     { y=x*x/4.0;
       ans=(log(x/2.0)*i1(x))+(1.0/x)*(1.0+y*(0.15443144
           +y*(-0.67278579+y*(-0.18156897+y*(-0.1919402e-1
           +y*(-0.110404e-2+y*(-0.4686e-4)))))));
     }
   else
     { y=2.0/x;
       ans=(exp(-x)/sqrt(x))*(1.25331414+y*(0.23498619
           +y*(-0.3655620e-1+y*(0.1504268e-1+y*(-0.780353e-2
           +y*(0.325614e-2+y*(-0.68245e-3)))))));
     }
   return ans;
}
/*_____________________________________________________________*/
#define ACC 40.0
#define BIGNO 1.0e10
#define BIGNI 1.0e-10

double bessi(unsigned n,double x)
{ unsigned j;
  double bi,bim,bip,tox,ans;
  assert (n >= 2);
  if (x == 0.0)
      return 0.0;
  else
    { tox=2.0/fabs(x);
      bip=ans=0.0;
      bi=1.0;
      for (j=2*(n+(int) sqrt(ACC*n));j>0;j--)
        { bim=bip+j*tox*bi;
          bip=bi;
          bi=bim;
          if (fabs(bi) > BIGNO)
            { ans *= BIGNI;
              bi *= BIGNI;
              bip *= BIGNI;
            }
          if (j == n) ans=bip;
        }
      ans *= i0(x)/bi;
      return  x < 0.0 && n%2 == 1 ? -ans : ans;
    }
}

#undef ACC
#undef BIGNO
#undef BIGNI
/*____________________________________________________________________*/
double i0(double x)
{ double ax,ans;
  double y;

  if ((ax=fabs(x)) < 3.75)
     {
                y=x/3.75;
                y*=y;
                ans=1.0+y*(3.5156229+y*(3.0899424+y*(1.2067492
                        +y*(0.2659732+y*(0.360768e-1+y*0.45813e-2)))));
     }
  else
     {
                y=3.75/ax;
                ans=(exp(ax)/sqrt(ax))*(0.39894228+y*(0.1328592e-1
                        +y*(0.225319e-2+y*(-0.157565e-2+y*(0.916281e-2
                        +y*(-0.2057706e-1+y*(0.2635537e-1+y*(-0.1647633e-1
                        +y*0.392377e-2))))))));
     }
 return ans;
}
/*__________________________________________________________________*/
double i1(double x)
{ double ax,ans;
  double y;
  if ((ax=fabs(x)) < 3.75)
     { y=x/3.75;
       y*=y;
       ans=ax*(0.5+y*(0.87890594+y*(0.51498869+y*(0.15084934
           +y*(0.2658733e-1+y*(0.301532e-2+y*0.32411e-3))))));
     }
  else
     { y=3.75/ax;
       ans=0.2282967e-1+y*(-0.2895312e-1+y*(0.1787654e-1 -y*0.420059e-2));
       ans=0.39894228+y*(-0.3988024e-1+y*(-0.362018e-2
           +y*(0.163801e-2+y*(-0.1031555e-1+y*ans))));
       ans *= (exp(ax)/sqrt(ax));
     }
  return x < 0.0 ? -ans : ans;
}

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists