// Return the partial fraction expansion of the approximation x^(-pnum/pden) int AlgRemez::getIPFE(Float *Res, Float *Pole, Float *Norm) { char *fname = "getIPFE(Float*, Float*, Float*)"; VRB.Func(cname,fname); bigfloat *r = new bigfloat[d]; if(r == 0) ERR.Pointer(cname,fname,"r"); VRB.Smalloc(cname,fname,"r",r,n * sizeof(bigfloat)); bigfloat *p = new bigfloat[n]; if(p == 0) ERR.Pointer(cname,fname,"p"); VRB.Smalloc(cname,fname,"p",p,d * sizeof(bigfloat)); // Want the inverse function for (int i=0; i<n; i++) { r[i] = poles[i]; p[i] = roots[i]; } // Perform a partial fraction expansion pfe(r, p, (bigfloat)1l/norm); // Convert to Float and return *Norm = (Float)((bigfloat)1l/(norm)); for (int i=0; i<n; i++) { Res[i] = (Float)r[i]; Pole[i] = (Float)p[i]; } VRB.Sfree(cname,fname, "r",r); delete [] r; VRB.Sfree(cname,fname, "p",p); delete [] p; // Where the smallest shift is located return 0; }
//!< Return the partial fraction expansion of the approximation x^(pnum/pden) int AlgRemez::getPFE(Float *Res, Float *Pole, Float *Norm) { char *fname = "getPFE(Float*, Float*, Float*)"; VRB.Func(cname,fname); if (n!=d) ERR.General(cname,fname,"Cannot handle case: Numerator degree neq Denominator degree\n"); bigfloat *r = new bigfloat[n]; if(r == 0) ERR.Pointer(cname,fname,"r"); VRB.Smalloc(cname,fname,"r",r,n * sizeof(bigfloat)); bigfloat *p = new bigfloat[d]; if(p == 0) ERR.Pointer(cname,fname,"p"); VRB.Smalloc(cname,fname,"p",p,d * sizeof(bigfloat)); for (int i=0; i<n; i++) r[i] = roots[i]; for (int i=0; i<d; i++) p[i] = poles[i]; // Perform a partial fraction expansion pfe(r, p, norm); // Convert to Float and return *Norm = (Float)norm; for (int i=0; i<n; i++) Res[i] = (Float)r[i]; for (int i=0; i<d; i++) Pole[i] = (Float)p[i]; VRB.Sfree(cname,fname, "r",r); delete [] r; VRB.Sfree(cname,fname, "p",p); delete [] p; // Where the smallest shift is located return 0; }
// Return the partial fraction expansion of the approximation x^(-pnum/pden) int AlgRemez::getIPFE(double *Res, double *Pole, double *Norm) { if (n!=d) { printf("Cannot handle case: Numerator degree neq Denominator degree\n"); return 0; } if (!alloc) { printf("Approximation not yet generated\n"); return 0; } if (!foundRoots) { printf("Roots not found, so PFE cannot be taken\n"); return 0; } bigfloat *r = new bigfloat[d]; bigfloat *p = new bigfloat[n]; // Want the inverse function for (int i=0; i<n; i++) { r[i] = poles[i]; p[i] = roots[i]; } // Perform a partial fraction expansion pfe(r, p, (bigfloat)1l/norm); // Convert to double and return *Norm = (double)((bigfloat)1l/(norm)); for (int i=0; i<n; i++) { Res[i] = (double)r[i]; Pole[i] = (double)p[i]; } delete [] r; delete [] p; // Where the smallest shift is located return 0; }