Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Some challenging C code
Message
From
20/12/2006 09:43:17
 
 
To
All
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Title:
Some challenging C code
Miscellaneous
Thread ID:
01179188
Message ID:
01179188
Views:
74
I've been porting an old application into FoxPro this week and thought I'd have it finished up pretty quickly...until I hit this particular function. It's some C code that's heavy on complex number arithmetic. I went at it from a couple different angles (handling complex numbers as arrays, handling them as objects) in Fox, but in the end, I never got anything very promising. Anyone have any smart ideas on converting this function into FoxPro? Thanks!
void laguer(Complex a[], int m, Complex *x, int *its)
{
  int iter, j;
  double abx, abp, abm, err;
  Complex dx,x1, b, d, f, g, h, sq, gp, gm, g2;
  static double frac[MR+1] = {0.0, 0.5, 0.25, 0.75, 0.13,
				0.38, 0.62, 0.88, 1.0};
  Complex xx, yy;

  for (iter = 1; iter <= MAXIT; iter++) {
    *its = iter;
    b = a[m];
    err = abs(b);
    d = f = Complex(0.0, 0.0);
    abx = abs(*x);
    for (j=m-1;j>=0;j--) {
      f = f = (*x) * f + d;
      d = (*x) * d + b;
      b = (*x) * b + a[j];
      err = abs(b) + abx * err;
    }
    err *= EPSS;
    
    if ( abs(b) <= err ) return;
    g = d/b;
    g2 = g*g;
    h = g2 - f/b * 2.0;
    sq = sqrt( (h*(m*1.0) - g2) * ((m-1)*1.0) );
    gp = g + sq;
    gm = g - sq;
    abp = abs(gp);
    abm = abs(gm);
    if (abp < abm) gp=gm;
 
    dx = (((abp > 0.0) || (abm>0)) 
	  ? Complex(m,0)/gp
	  : Complex( cos(iter), sin(iter)) * exp( log(1+abx) ) );

	//   : Complex( cos(iter), sin(iter) ) * exp( log(1+abx) ) );

    x1 = *x - dx;
    if (real(*x) == real(x1) && imag(*x) == imag(x1)) return;
    if (iter % MT) *x = x1;
    else *x = *x - frac[iter/MT] * dx;
  }
  assert( 0 );
  // exit(1);
}
Next
Reply
Map
View

Click here to load this message in the networking platform