22 std::cout<<
"Approximation bounds are ["<<
apstrt<<
","<<
apend<<
"]\n";
23 std::cout<<
"Precision of arithmetic is "<<precision<<std::endl;
46 for(
int i=0;i<=
pow_n;i++){
48 if(i % 2 == 0 && even)
num_pows[i] = n_in++;
49 if(i % 2 == 1 && odd)
num_pows[i] = n_in++;
52 std::cout << n_in <<
" terms in numerator" << std::endl;
58 for(
int i=0;i<=
pow_d;i++){
60 if(i % 2 == 0 && even)
den_pows[i] = d_in++;
61 if(i % 2 == 1 && odd)
den_pows[i] = d_in++;
64 std::cout << d_in <<
" terms in denominator" << std::endl;
98 const double _tolerance,
const int report_freq){
108 while (
spread > tolerance) {
109 if (
iter++ % report_freq==0)
110 std::cout<<
"Iteration " <<
iter-1<<
" spread "<<(double)
spread<<
" delta "<<(
double)
delta << std::endl;
113 if (
delta < tolerance) {
114 std::cout<<
"Iteration " <<
iter-1 <<
" delta too small (" <<
delta <<
"<" << tolerance <<
"), try increasing precision\n";
117 assert(
delta>= tolerance );
123 double error = (double)
getErr(
mm[0],&sign);
124 std::cout<<
"Converged at "<<
iter<<
" iterations; error = "<<error<<std::endl;
141 for (
long i = 1; i < ncheb; i++) {
142 r = 0.5 * (1 -
cos((
M_PI * i)/(
double) a));
144 r = (
exp((
double)r)-1.0)/(
exp(1.0)-1.0);
150 for (
long i = 0; i <= ncheb; i++) {
151 r = 0.5 * (1 -
cos(
M_PI * (2*i+1)/(
double) a));
153 r = (
exp((
double)r)-1.0)/(
exp(1.0)-1.0);
163 for (
int i = 1; i <
neq; i++)
step[i] =
xx[i] -
xx[i-1];
170 int emsign, ensign, steps;
179 for (
int i = 0; i < meq; i++) {
182 if (i == meq-1) xx1 =
apend;
187 if (xn < xx0 || xn >= xx1) {
210 if (a == xm || a <= xx0 || a >= xx1)
220 if (eclose > ym) eclose = ym;
221 if (farther < ym) farther = ym;
226 q = (farther - eclose);
228 if (eclose != 0.0) q /= eclose;
235 for (
int i = 0; i <
neq; i++) {
240 q *=
mm[i+1] -
mm[i];
245 for (
int i = 0; i <
neq; i++) {
269 for (
int i = 0; i <
neq; i++) {
277 for (
int j = 0; j <=
pow_n; j++) {
278 if(
num_pows[j] != -1){ *aa++ = z; t++; }
285 for (
int j = 0; j <
pow_d; j++) {
286 if(
den_pows[j] != -1){ *aa++ = -y * z; t++; }
296 std::cout<<
"simq failed\n";
334 int ip, ipj, ipk, ipn;
336 int kp, kp1, kpk, kpn;
347 for (
int i = 0; i <
n; i++) {
350 for(
int j = 0; j <
n; j++) {
352 if(rownrm < q) rownrm = q;
356 std::cout<<
"simq rownrm=0\n";
362 for (
int k = 0; k < nm1; k++) {
366 for (
int i = k; i <
n; i++) {
369 size = abs_bf(
A[ipk]) * X[ip];
377 std::cout<<
"simq big=0\n";
389 for (
int i = kp1; i <
n; i++) {
392 em = -
A[ipk] / pivot;
396 aa =
A.data()+nkp+kp1;
397 for (
int j = kp1; j <
n; j++) {
399 A[ipj] =
A[ipj] + em * *aa++;
403 kpn =
n *
IPS[
n-1] +
n - 1;
405 std::cout<<
"simq A[kpn]=0\n";
412 for (
int i = 1; i <
n; i++) {
416 for (
int j = 0; j < i; j++) {
417 sum +=
A[ipj] * X[j];
423 ipn =
n *
IPS[
n-1] +
n - 1;
424 X[
n-1] = X[
n-1] /
A[ipn];
426 for (
int iback = 1; iback <
n; iback++) {
432 aa =
A.data()+nip+i+1;
433 for (
int j= i + 1; j <
n; j++)
435 X[i] = (X[i] -
sum) /
A[nip+i];
442 os <<
"Numerator" << std::endl;
443 for(
int i=0;i<=
pow_n;i++){
445 if(i!=
pow_n) os <<
" + ";
449 os <<
"Denominator" << std::endl;
450 for(
int i=0;i<=
pow_d;i++){
452 if(i!=
pow_d) os <<
" + ";
458 os <<
"Errors at maxima: coordinate, error, (sign)" << std::endl;
459 for(
int i=0;i<
neq+1;i++){
460 os <<
mm[i] <<
" " <<
getErr(
mm[i],&sign) <<
" (" << sign <<
")" << std::endl;
463 os <<
"Scan over range:" << std::endl;
470 os<< x<<
","<<r<<
","<<
f<<
","<<r-
f<<std::endl;
accelerator_inline Grid_simd< S, V > cos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > exp(const Grid_simd< S, V > &r)
vobj::scalar_object sum(const vobj *arg, Integer osites)
std::vector< bigfloat > xx
std::vector< bigfloat > A
double generateApprox(int num_degree, int den_degree, PolyType num_type, PolyType den_type, const double tolerance=1e-15, const int report_freq=1000)
void setupPolyProperties(int num_degree, int den_degree, PolyType num_type_in, PolyType den_type_in)
std::vector< int > num_pows
double evaluateApprox(double x) const
bigfloat approx(bigfloat x) const
bigfloat func(bigfloat x) const
void csv(std::ostream &os=std::cout) const
bigfloat(* f)(bigfloat x, void *data)
double getCoeffNum(const int i) const
bigfloat getErr(bigfloat x, int *sign) const
double evaluateFunc(double x) const
std::vector< bigfloat > param
void reinitializeAlgorithm()
double getCoeffDen(const int i) const
AlgRemezGeneral(double lower, double upper, long prec, bigfloat(*f)(bigfloat x, void *data), void *data)
std::vector< bigfloat > step
std::vector< bigfloat > B
std::vector< int > den_pows
std::vector< bigfloat > mm
std::vector< bigfloat > yy
static void setDefaultPrecision(unsigned long dprec)