Department of Scientific Computing   
Institute for Numerical Simulation   
University of Bonn   
Documentation
Download
Programming References
Bug Reports / Suggestions
FAQ
Authors
Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

Math.cc

00001 #include "Math.hpp"
00002 
00003 void swapbytes(void *p , int size, int nitem) {
00004  assert((size&1)==0) ;
00005  
00006  char *p1=(char *)p , a ;
00007   
00008  for (int j=0; j<nitem; j++) {
00009    for (int i=0; i<size/2; i++) {
00010      a           =p1[i] ;
00011      p1[i]       =p1[size-1-i] ;
00012      p1[size-1-i]=a ;
00013    }
00014    p1=&p1[size] ;
00015  } 
00016 }
00017 
00018 int  doublecmp(const void *pa , const void *pb) {
00019  double a=(*(double *)pa) , b=(*(double *)pb) ;
00020  if (a <b) return -1 ;
00021  if (a==b) return  0 ;
00022  if (a >b) return +1 ;
00023  return -MAXINT ;
00024 }
00025 
00026 // (l,s)->x
00027 void code  (int l,unsigned long s , unsigned long *x , int jmx1, int L0) {
00028   if (l > L0) *x=(2*s+1)*(1<<(jmx1-l)) + 0 ;
00029   else        *x=     s *(1<<(jmx1-l)) + 0 ;
00030 }
00031 
00032 // x->(l,s) 
00033 void decode(int *l,unsigned long *s , unsigned long x , int jmx1, int L0) {
00034   int q ;
00035   x -=0 ; // MatLab arrays start with 1 instead of 0 ....
00036   q=1<<(jmx1-L0) ; // initial divisor
00037  *l=L0           ; // inital level
00038 
00039   if ((x % q)==0) {
00040    *s=x/q ;
00041   } else {
00042    do {
00043      q/=2 ;
00044      (*l)++ ;
00045      (*s)=(x/q-1)/2 ;
00046     } while((x % q)!=0) ;
00047   };
00048 }
00049 
00050 
00051 #ifdef _CLN_
00052 // Integral Sinus function
00053 cl_F Si(cl_F x) {
00054  int l,L=8 ; // Abruch der Taylorreihe bei ... 
00055   
00056  cl_float_format_t prec = cl_float_format(_CLN_DIGITS_);
00057  cl_F z1=cl_float(0.0,prec) ;
00058  cl_F z3=cl_float(0.0,prec) ;
00059  cl_F y =x*x*x*x ;
00060  cl_RA r ;
00061  
00062  for (l=L; l>0; l--) {
00063    r=4*l+1 ; r=recip(r) ;
00064    z1 = z1 + cl_float(r,prec) ;
00065 
00066    r=(4*l+1)*4*l*(4*l-1)*(4*l-2) ; r=recip(r) ;
00067    z1 = z1*y*cl_float(r,prec) ; 
00068 
00069    r=4*l+3 ; r=recip(r) ;
00070    z3 = z3 + cl_float(r,prec) ;
00071 
00072    r=(4*l+3)*(4*l+2)*(4*l+1)*4*l ; r=recip(r) ;
00073    z3 = z3*y*cl_float(r,prec) ;
00074  }
00075  
00076  z1=(1+z1)*x ;
00077  
00078  r=3 ; r=recip(r) ;
00079  z3=(cl_float(r,prec) + z3)*x*x*x ;
00080  
00081  r=6 ; r=recip(r) ;
00082  z3=z3*cl_float(r,prec) ;
00083 
00084  return z1-z3 ;
00085 }
00086 
00087 
00088 // Integral Cosinus function
00089 cl_F Ci(cl_F x) {
00090  cl_float_format_t prec = cl_float_format(_CLN_DIGITS_);
00091  return cl_eulerconst(prec) + ln(x) + CCi(x) ;
00092 }
00093 
00094 // Integral Cosinus function
00095 cl_F CCi(cl_F x) {
00096  int l,L=8 ; // Abruch der Taylorreihe bei ... 
00097 
00098  cl_float_format_t prec = cl_float_format(_CLN_DIGITS_);
00099  cl_F z0=cl_float(0.0,prec) ;
00100  cl_F z2=cl_float(0.0,prec) ;
00101  cl_F y =x*x*x*x ;
00102  cl_RA r ;
00103 
00104  for (l=L; l>0; l--) {
00105    r=4*l ; r=recip(r) ;
00106    z0 = z0 + cl_float(r,prec) ; 
00107 
00108    r=(4*l)*(4*l-1)*(4*l-2)*(4*l-3) ; r=recip(r) ;
00109    z0 = z0*y*cl_float(r,prec) ;
00110 
00111    r=4*l+2 ; r=recip(r) ;
00112    z2 = z2 + cl_float(r,prec) ;
00113 
00114    r=(4*l+2)*(4*l+1)*(4*l)*(4*l-1) ; r=recip(r) ;
00115    z2 = z2*y*cl_float(r,prec) ;
00116  }
00117 
00118  r=2 ; r=recip(r) ;
00119  z2 = (cl_float(r,prec) + z2)*x*x*cl_float(r,prec) ;
00120 
00121  return z0-z2 ;
00122 }
00123 
00124 //
00125 // interfaces fuer double 
00126 //
00127 double Si(double x) {
00128  cl_float_format_t prec = cl_float_format(_CLN_DIGITS_);
00129  cl_F cx=cl_float(x,prec) ;
00130  return cl_double_approx(Si(cx)) ;
00131 }
00132 
00133 double Ci(double x) {
00134  cl_float_format_t prec = cl_float_format(_CLN_DIGITS_);
00135  cl_F cx=cl_float(x,prec) ;
00136  return cl_double_approx(Ci(cx)) ;
00137 }
00138 
00139 double CCi(double x) {
00140  cl_float_format_t prec = cl_float_format(_CLN_DIGITS_);
00141  cl_F cx=cl_float(x,prec) ;
00142  return cl_double_approx(CCi(cx)) ;
00143 }
00144 
00145 #endif

Generated at Mon Aug 19 10:02:31 2002 for AWFD by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001