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
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
00033 void decode(int *l,unsigned long *s , unsigned long x , int jmx1, int L0) {
00034 int q ;
00035 x -=0 ;
00036 q=1<<(jmx1-L0) ;
00037 *l=L0 ;
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
00053 cl_F Si(cl_F x) {
00054 int l,L=8 ;
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
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
00095 cl_F CCi(cl_F x) {
00096 int l,L=8 ;
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
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