Konstantin Ladutenko 3 éve
szülő
commit
b11c17b136

+ 49 - 0
src/special-functions-impl.hpp

@@ -353,6 +353,24 @@ void evalUpwardD3 (const std::complex<FloatType> z,
   }
 }
 
+void evalUpwardPsiZeta (const std::complex<FloatType> z,
+                   const std::vector<std::complex<FloatType> >& D1,
+                   std::vector<std::complex<FloatType> >& PsiZeta) {
+  int nmax = D1.size()-1;
+  std::vector<std::complex<FloatType> > D3(nmax+1);
+
+  // Upward recurrence for PsiZeta and D3 - equations (18a) - (18d)
+  PsiZeta[0] = static_cast<FloatType>(0.5)*(static_cast<FloatType>(1.0) - std::complex<FloatType>(nmm::cos(2.0*z.real()), nmm::sin(2.0*z.real()))
+      *static_cast<FloatType>(nmm::exp(-2.0*z.imag())));
+  D3[0] = std::complex<FloatType>(0.0, 1.0);
+  const std::complex<FloatType> zinv = std::complex<FloatType>(1.0, 0.0)/z;
+  for (int n = 1; n <= nmax; n++) {
+    PsiZeta[n] = PsiZeta[n - 1]*(static_cast<FloatType>(n)*zinv - D1[n - 1])
+        *(static_cast<FloatType>(n)*zinv - D3[n - 1]);
+    D3[n] = D1[n] + std::complex<FloatType>(0.0, 1.0)/PsiZeta[n];
+  }
+}
+
 void evalUpwardPsi (const std::complex<FloatType> z,
                     const std::vector<std::complex<FloatType> > D1,
                    std::vector<std::complex<FloatType> >& Psi) {
@@ -378,5 +396,36 @@ void evalUpwardZeta (const std::complex<FloatType> z,
   }
 }
 
+void evalForwardRiccatiBessel(const FloatType x, const FloatType first, const FloatType second,
+                              std::vector<FloatType> &values) {
+  values[0] = first;
+  values[1] = second;
+  int nmax = values.size();
+  for (int i = 1; i < nmax-1; i++) {
+    values[i+1] = (1 + 2*i) * values[i]/x - values[i-1];
+  }
+}
+
+void evalChi(const FloatType x, std::vector<FloatType> &Chi) {
+  auto first = nmm::cos(x);
+  auto second = first/x + nmm::sin(x);
+  evalForwardRiccatiBessel(x, first, second, Chi);
+}
+
+void evalPsi(const FloatType x, std::vector<FloatType> &Psi) {
+  auto first = nmm::sin(x);
+  auto second = first/x - nmm::cos(x);
+  evalForwardRiccatiBessel(x, first, second, Psi);
+}
+
+void composeZeta(const std::vector<FloatType> &Psi,
+                 const std::vector<FloatType> &Chi,
+                 std::vector< std::complex<FloatType>> &Zeta) {
+  int nmax = Zeta.size();
+  for (int i = 0; i < nmax; i++) {
+    Zeta[i] = std::complex<FloatType > (Psi[i], Chi[i]);
+  }
+}
+
 }  // end of namespace nmie
 #endif  // SRC_SPECIAL_FUNCTIONS_IMPL_HPP_

+ 3 - 2
tests/mpmath_special_functions_test_generator.py

@@ -197,11 +197,12 @@ def main():
     # sf_evals.run_test(mrb.D3, 'D3')
     # sf_evals.run_test(mrb.psi, 'psi', is_only_x=True)
     # # In literature Zeta or Ksi denote the Riccati-Bessel function of third kind.
-    sf_evals.run_test(mrb.ksi, 'zeta', is_only_x=True)
+    # sf_evals.run_test(mrb.xi, 'xi', is_only_x=True)
+    # sf_evals.run_test(mrb.ksi, 'zeta', is_only_x=True)
 
     # sf_evals.run_test(mrb.psi, 'psi')
     # sf_evals.run_test(mrb.psi_div_ksi, 'psi_div_ksi')
-    # sf_evals.run_test(mrb.psi_mul_ksi, 'psi_mul_ksi')
+    sf_evals.run_test(mrb.psi_mul_ksi, 'psi_mul_zeta', is_only_x=True)
     # sf_evals.run_test(mrb.psi_div_xi, 'psi_div_xi')
     with open(sf_evals.filename, 'w') as out_file:
         out_file.write(sf_evals.get_file_content())

+ 52 - 13
tests/test_Riccati_Bessel_logarithmic_derivative.cc

@@ -62,33 +62,72 @@ void parse_mpmath_data(const double min_abs_tol, const std::tuple< std::complex<
   im_abs_tol *= std::abs(std::round(std::imag(func_mp))) + 1;
 }
 
+template<class T> inline T pow2(const T value) {return value*value;}
 
 //TEST(zeta_test, DISABLED_mpmath_generated_input) {
 TEST(zeta_test, mpmath_generated_input) {
-  double min_abs_tol = 2e-11;
+  double min_abs_tol = 2e-5;
   std::complex<double> z, zeta_mp;
   int n;
   double re_abs_tol,  im_abs_tol;
   for (const auto &data : zeta_test_16digits) {
     parse_mpmath_data(min_abs_tol, data, z, n, zeta_mp, re_abs_tol, im_abs_tol);
-    auto Nstop = LeRu_cutoff(z)+1000;
+    auto Nstop = LeRu_cutoff(z)+10000;
     if (n > Nstop) continue;
-    std::vector<std::complex<nmie::FloatType>> D1dr(Nstop+35), D3(Nstop+35), zeta(Nstop);
+    std::vector<std::complex<nmie::FloatType>> D1dr(Nstop+135),
+        PsiZeta(Nstop+135), Psi(Nstop);
     nmie::evalDownwardD1(z, D1dr);
-    nmie::evalUpwardD3(z, D1dr, D3);
-    nmie::evalUpwardZeta(z, D3, zeta);
+    nmie::evalUpwardPsiZeta(z, D1dr, PsiZeta);
+    nmie::evalUpwardPsi(z, D1dr, Psi);
+    auto a = std::real(PsiZeta[n]);
+    auto b = std::imag(PsiZeta[n]);
+    auto c = std::real(Psi[n]);
+    auto d = std::imag(Psi[n]);
+    auto c_one = std::complex<nmie::FloatType>(0, 1);
+    auto zeta = (a*c + b*d)/(pow2(c) + pow2(d)) +
+        c_one * ((b*c - a*d)/(pow2(c) + pow2(d)));
+    if (std::isnan(std::real(zeta)) || std::isnan(std::imag(zeta))) continue;
+//    std::complex<nmie::FloatType > zeta = PsiZeta[n]/Psi[n];
+//    std::vector<std::complex<nmie::FloatType>> D1dr(Nstop+35), D3(Nstop+35), zeta(Nstop);
+//    nmie::evalDownwardD1(z, D1dr);
+//    nmie::evalUpwardD3(z, D1dr, D3);
+//    nmie::evalUpwardZeta(z, D3, zeta);
 
-    EXPECT_NEAR(std::real(zeta[n]), std::real(zeta_mp), re_abs_tol)
+    EXPECT_NEAR(std::real(zeta), std::real(zeta_mp), re_abs_tol)
               << "zeta at n=" << n << " Nstop="<< Nstop<<" z="<<z;
-    EXPECT_NEAR(std::imag(zeta[n]), std::imag(zeta_mp), im_abs_tol)
+    EXPECT_NEAR(std::imag(zeta), std::imag(zeta_mp), im_abs_tol)
               << "zeta at n=" << n << " Nstop="<< Nstop<<" z="<<z;
   }
 }
 
 
-//TEST(psi_test, DISABLED_mpmath_generated_input) {
+TEST(psizeta_test, mpmath_generated_input) {
+  double min_abs_tol = 9e-11;
+  std::complex<double> z, PsiZeta_mp;
+  int n;
+  double re_abs_tol,  im_abs_tol;
+  for (const auto &data : psi_mul_zeta_test_16digits) {
+    parse_mpmath_data(min_abs_tol, data, z, n, PsiZeta_mp, re_abs_tol, im_abs_tol);
+    auto Nstop = LeRu_cutoff(z)+10000;
+    if (n > Nstop) continue;
+    std::vector<std::complex<nmie::FloatType>> D1dr(Nstop+135), PsiZeta(Nstop+135);
+    nmie::evalDownwardD1(z, D1dr);
+    nmie::evalUpwardPsiZeta(z, D1dr, PsiZeta);
+
+    EXPECT_NEAR(std::real(PsiZeta[n]), std::real(PsiZeta_mp), re_abs_tol)
+              << "PsiZeta at n=" << n << " Nstop="<< Nstop<<" z="<<z;
+    EXPECT_NEAR(std::imag(PsiZeta[n]), std::imag(PsiZeta_mp), im_abs_tol)
+              << "PsiZeta at n=" << n << " Nstop="<< Nstop<<" z="<<z;
+//    std::vector<nmie::FloatType> PsiUp(Nstop);
+//    nmie::evalPsi(std::real(z), PsiUp);
+//    EXPECT_NEAR(((PsiUp[n])), std::real(PsiZeta_mp), re_abs_tol)
+//              << "PsiZeta(up) at n=" << n << " z="<<z;
+  }
+}
+
+
 TEST(psi_test, mpmath_generated_input) {
-  double min_abs_tol = 2e-11;
+  double min_abs_tol = 1e-12;
   std::complex<double> z, Psi_mp;
   int n;
   double re_abs_tol,  im_abs_tol;
@@ -108,8 +147,8 @@ TEST(psi_test, mpmath_generated_input) {
 }
 
 
-TEST(D3test, DISABLED_mpmath_generated_input) {
-//TEST(D3test, mpmath_generated_input) {
+//TEST(D3test, DISABLED_mpmath_generated_input) {
+TEST(D3test, mpmath_generated_input) {
   double min_abs_tol = 2e-11;
   std::complex<double> z, D3_mp;
   int n;
@@ -130,8 +169,8 @@ TEST(D3test, DISABLED_mpmath_generated_input) {
 }
 
 
-TEST(D1test, DISABLED_mpmath_generated_input) {
-//  TEST(D1test, mpmath_generated_input) {
+//TEST(D1test, DISABLED_mpmath_generated_input) {
+  TEST(D1test, mpmath_generated_input) {
   double min_abs_tol = 2e-11;
   std::complex<double> z, D1_mp;
   int n;

+ 454 - 0
tests/test_spec_functions_data.hpp

@@ -1649,6 +1649,233 @@ D3_test_16digits
 
 // complex(z), n, complex(f(n,z)), abs_err_real, abs_err_imag
 std::vector< std::tuple< std::complex<double>, int, std::complex<double>, double, double > >
+psi_mul_zeta_test_16digits
+= {
+{{0.055,0.0},0,{0.003021951021651575,-0.0548891504185874},3.0e-19,5.5e-18},
+{{0.055,0.0},1,{1.016121145233281e-6,-0.01835548791829774},1.0e-22,1.8e-18},
+{{0.055,0.0},2,{1.229719152492059e-10,-0.01100317224014702},1.2e-26,1.1e-18},
+{{0.055,0.0},3,{7.592362656062244e-15,-0.0078581994970704},7.6e-31,7.9e-19},
+{{0.055,0.0},4,{2.835592674223453e-19,-0.006111591336893846},2.8e-35,6.1e-19},
+{{0.055,0.0},5,{7.089281618184475e-24,-0.005000258569357047},7.1e-40,5.0e-19},
+{{0.056,0.0},0,{0.003132723205069868,-0.05588299607564259},3.1e-19,5.6e-18},
+{{0.056,0.0},1,{1.092036606873679e-6,-0.01869005067512779},1.1e-22,1.9e-18},
+{{0.056,0.0},2,{1.370096242130984e-10,-0.01120334856005436},1.4e-26,1.1e-18},
+{{0.056,0.0},3,{8.769489006914592e-15,-0.008001115340360345},8.8e-31,8.0e-19},
+{{0.056,0.0},4,{3.395414807371369e-19,-0.006222729123879648},3.4e-35,6.2e-19},
+{{0.056,0.0},5,{8.800403208656495e-24,-0.005091182022901522},8.8e-40,5.1e-19},
+{{0.099,0.0},0,{0.00976902194728147,-0.09835440080380238},9.8e-19,9.8e-18},
+{{0.099,0.0},1,{1.06523847864875e-5,-0.03312883043424608},1.1e-21,3.3e-18},
+{{0.099,0.0},2,{4.178501167517404e-9,-0.01981854208686302},4.2e-25,2.0e-18},
+{{0.099,0.0},3,{8.360456441867183e-13,-0.01414902327431168},8.4e-29,1.4e-18},
+{{0.099,0.0},4,{1.011815572763764e-16,-0.01100280155335579},1.0e-32,1.1e-18},
+{{0.101,0.0},0,{0.0101663603439792,-0.1003145326527297},1.0e-18,1.0e-17},
+{{0.101,0.0},1,{1.153869805655288e-5,-0.03380344031202756},1.2e-21,3.4e-18},
+{{0.101,0.0},2,{4.71099650661284e-9,-0.02021969130565892},4.7e-25,2.0e-18},
+{{0.101,0.0},3,{9.810702765077567e-13,-0.01443511910448818},9.8e-29,1.4e-18},
+{{0.101,0.0},4,{1.235797628684462e-16,-0.01122519707488852},1.2e-32,1.1e-18},
+{{1.0,0.0},0,{0.7080734182735712,-0.4546487134128408},7.1e-17,4.5e-17},
+{{1.0,0.0},1,{0.0907025731743183,-0.4161468365471424},9.1e-18,4.2e-17},
+{{1.0,0.0},2,{0.00384834767805386,-0.2236374522186501},3.8e-19,2.2e-17},
+{{1.0,0.0},3,{8.111850341912774e-5,-0.1498993624632433},8.1e-21,1.5e-17},
+{{1.0,0.0},4,{1.022152964862514e-6,-0.1141418489822765},1.0e-22,1.1e-17},
+{{1.0,0.0},5,{8.567568083458491e-9,-0.09250935614721912},8.6e-25,9.3e-18},
+{{1.0,0.0},6,{5.122173734664295e-11,-0.07787423460333869},5.1e-27,7.8e-18},
+{{1.0,0.0},7,{2.29453856419336e-13,-0.06727880114332268},2.3e-29,6.7e-18},
+{{1.0,0.0},8,{7.9890954789213e-16,-0.05924092305054686},8.0e-32,5.9e-18},
+{{1.0,0.0},9,{2.224203872373618e-18,-0.05292902429724696},2.2e-34,5.3e-18},
+{{1.0,0.0},10,{5.064532147856438e-21,-0.04783853491685147},5.1e-37,4.8e-18},
+{{1.0,0.0},11,{9.607221700532625e-24,-0.04364486754339771},9.6e-40,4.4e-18},
+{{1.0,0.0},12,{1.541726004756763e-26,-0.0401294626939617},1.5e-42,4.0e-18},
+{{1.0,0.0},13,{2.120268814274514e-29,-0.03713964014500267},2.1e-45,3.7e-18},
+{{1.0,0.0},14,{2.52675182009057e-32,-0.0345654555670251},2.5e-48,3.5e-18},
+{{1.0,0.0},15,{2.634446675966918e-35,-0.03232569427903133},2.6e-51,3.2e-18},
+{{1.0,0.0},16,{2.423340639723846e-38,-0.03035904509315811},2.4e-54,3.0e-18},
+{{1.0,0.0},17,{1.981298117039575e-41,-0.02861834507392694},2.0e-57,2.9e-18},
+{{1.0,0.0},19,{9.540329388323879e-48,-0.02567489808970744},9.5e-64,2.6e-18},
+{{1.0,0.0},20,{5.68183643501725e-51,-0.02441938436699653},5.7e-67,2.4e-18},
+{{1.0,0.0},22,{1.520501862524084e-57,-0.02224424642998028},1.5e-73,2.2e-18},
+{{1.0,0.0},24,{2.871601965313674e-64,-0.02042521280234952},2.9e-80,2.0e-18},
+{{1.0,0.0},26,{3.935970015906627e-71,-0.0188813920614356},3.9e-87,1.9e-18},
+{{1.0,0.0},28,{4.009703575122698e-78,-0.01755468254961163},4.0e-94,1.8e-18},
+{{1.0,0.0},30,{3.098961035504115e-85,-0.01640227056413152},3.1e-101,1.6e-18},
+{{1.0,0.0},32,{1.849779662426908e-92,-0.01539191014397623},1.8e-108,1.5e-18},
+{{1.0,0.0},35,{1.71904973391556e-103,-0.01409010280215318},1.7e-119,1.4e-18},
+{{1.0,0.0},38,{9.682571192175845e-115,-0.01299139901427509},9.7e-131,1.3e-18},
+{{1.0,0.0},41,{3.435567055681588e-126,-0.01205169413760676},3.4e-142,1.2e-18},
+{{10.0,0.0},0,{0.295958969093304,-0.4564726253638138},3.0e-17,4.6e-17},
+{{10.0,0.0},1,{0.6157060955248663,0.4927161052915149},6.2e-17,4.9e-17},
+{{10.0,0.0},2,{0.607498554763232,-0.5071644369097663},6.1e-17,5.1e-17},
+{{10.0,0.0},3,{0.155992177103731,0.3765039328469335},1.6e-17,3.8e-17},
+{{10.0,0.0},4,{1.114909713166518,0.01752708452606332},1.1e-16,1.8e-18},
+{{10.0,0.0},5,{0.3084081981033207,-0.5210999910837328},3.1e-17,5.2e-17},
+{{10.0,0.0},6,{0.1980367689482958,0.4667157442158694},2.0e-17,4.7e-17},
+{{10.0,0.0},7,{1.285643730232455,0.4819632788028717},1.3e-16,4.8e-17},
+{{10.0,0.0},8,{1.576984002373142,-0.5163432757216197},1.6e-16,5.2e-17},
+{{10.0,0.0},9,{1.001929120449916,-1.125141593050778},1.0e-16,1.1e-16},
+{{10.0,0.0},10,{0.4173825987008097,-1.114139612805899},4.2e-17,1.1e-16},
+{{10.0,0.0},11,{0.1265538994473744,-0.8884600619485133},1.3e-17,8.9e-17},
+{{10.0,0.0},12,{0.02963906472195924,-0.6920216399635206},3.0e-18,6.9e-17},
+{{10.0,0.0},13,{0.00557349515770663,-0.5637738390408905},5.6e-19,5.6e-17},
+{{10.0,0.0},14,{0.0008649941812568645,-0.481447977558081},8.6e-20,4.8e-17},
+{{10.0,0.0},16,{1.266677095416471e-5,-0.3821856201495292},1.3e-21,3.8e-17},
+{{10.0,0.0},17,{1.230784512285205e-6,-0.3488508522354134},1.2e-22,3.5e-17},
+{{10.0,0.0},18,{1.049013273275846e-7,-0.3216769516939968},1.0e-23,3.2e-17},
+{{10.0,0.0},19,{7.914997677111618e-9,-0.2989560911306167},7.9e-25,3.0e-17},
+{{10.0,0.0},21,{3.222807603140006e-11,-0.2628401183295979},3.2e-27,2.6e-17},
+{{10.0,0.0},22,{1.761684361765775e-12,-0.2481689046072283},1.8e-28,2.5e-17},
+{{10.0,0.0},24,{3.967619823175087e-15,-0.2236071766951387},4.0e-31,2.2e-17},
+{{10.0,0.0},26,{6.31219784387027e-18,-0.2037765868337052},6.3e-34,2.0e-17},
+{{10.0,0.0},27,{2.231089847919333e-19,-0.1952071171449887},2.2e-35,2.0e-17},
+{{10.0,0.0},30,{6.310432305527727e-24,-0.1735409287284763},6.3e-40,1.7e-17},
+{{80.0,0.0},0,{0.9878146563976187,-0.1097126291895024},9.9e-17,1.1e-17},
+{{80.0,0.0},1,{0.009596873912705912,0.09750012018125104},9.6e-19,9.8e-18},
+{{80.0,0.0},30,{0.8255342447375176,-0.4598133020429286},8.3e-17,4.6e-17},
+{{80.0,0.0},50,{0.7243467146069976,0.6395688164674208},7.2e-17,6.4e-17},
+{{80.0,0.0},60,{0.4103464301592875,-0.6769649626635265},4.1e-17,6.8e-17},
+{{80.0,0.0},70,{0.9296298544868326,-1.044106068321243},9.3e-17,1.0e-16},
+{{80.0,0.0},75,{2.826505371942847,0.4810026687100474},2.8e-16,4.8e-17},
+{{80.0,0.0},80,{1.080302660792914,-2.317525151179967},1.1e-16,2.3e-16},
+{{80.0,0.0},85,{0.0407412363570179,-1.372072053151429},4.1e-18,1.4e-16},
+{{80.0,0.0},90,{0.0003667279064351009,-0.9514780407757143},3.7e-20,9.5e-17},
+{{80.0,0.0},99,{5.38333281008969e-9,-0.6766919376604463},5.4e-25,6.8e-17},
+{{80.0,0.0},116,{4.079975765758877e-21,-0.4723779421220265},4.1e-37,4.7e-17},
+{{80.0,0.0},130,{2.364875566095132e-33,-0.3879804405443515},2.4e-49,3.9e-17},
+{{100.0,0.0},0,{0.256406162496497,0.4366486486069973},2.6e-17,4.4e-17},
+{{100.0,0.0},1,{0.7523524510918926,-0.4317331069920665},7.5e-17,4.3e-17},
+{{100.0,0.0},2,{0.230730517088562,0.4213824693713301},2.3e-17,4.2e-17},
+{{100.0,0.0},3,{0.7945934910545345,-0.4045884190987047},7.9e-17,4.0e-17},
+{{100.0,0.0},4,{0.1746790124372205,0.3799225844242402},1.7e-17,3.8e-17},
+{{100.0,0.0},5,{0.8630686723276429,-0.3456565727640024},8.6e-17,3.5e-17},
+{{100.0,0.0},6,{0.09970093292656848,0.2999510941211375},1.0e-17,3.0e-17},
+{{100.0,0.0},7,{0.9410221936833145,-0.2411327490155267},9.4e-17,2.4e-17},
+{{100.0,0.0},8,{0.0289833932973693,0.1680721489154539},2.9e-18,1.7e-17},
+{{100.0,0.0},9,{0.9980102927237763,-0.08066377424553287},1.0e-16,8.1e-18},
+{{100.0,0.0},10,{0.0003828199806763987,-0.01961622142888973},3.8e-20,2.0e-18},
+{{100.0,0.0},12,{0.06169850033611365,-0.2416167884883422},6.2e-18,2.4e-17},
+{{100.0,0.0},14,{0.250247316674531,-0.4362257370084827},2.5e-17,4.4e-17},
+{{100.0,0.0},17,{0.2938292525898981,0.4605370126483646},2.9e-17,4.6e-17},
+{{100.0,0.0},19,{0.03858070680264446,0.1945423348167594},3.9e-18,1.9e-17},
+{{100.0,0.0},23,{0.3977295322443018,-0.5009915439616875},4.0e-17,5.0e-17},
+{{100.0,0.0},26,{0.0207047771805246,0.1450632139773643},2.1e-18,1.5e-17},
+{{100.0,0.0},31,{0.06019568065492113,0.2445393267844256},6.0e-18,2.4e-17},
+{{100.0,0.0},36,{0.006436145631620102,0.08289433103146386},6.4e-19,8.3e-18},
+{{100.0,0.0},42,{0.5490517797556987,0.5523367487618802},5.5e-17,5.5e-17},
+{{100.0,0.0},49,{0.8079050821220394,-0.5263512418188373},8.1e-17,5.3e-17},
+{{100.0,0.0},57,{0.5952247031640156,0.6108677512179897},6.0e-17,6.1e-17},
+{{100.0,0.0},66,{0.3499557066756242,-0.58823274813532},3.5e-17,5.9e-17},
+{{100.0,0.0},76,{0.9758072300221017,0.7497215985189103},9.8e-17,7.5e-17},
+{{100.0,0.0},89,{1.253396334302241,-1.105547490464419},1.3e-16,1.1e-16},
+{{100.0,0.0},103,{0.2364244628680228,-1.912256568210032},2.4e-17,1.9e-16},
+{{100.0,0.0},120,{1.091890360981933e-8,-0.7443857013666448},1.1e-24,7.4e-17},
+{{100.0,0.0},140,{4.969528549863077e-22,-0.5066841997377345},5.0e-38,5.1e-17},
+{{100.0,0.0},162,{9.53179081403156e-41,-0.3903728156193839},9.5e-57,3.9e-17},
+{{100.0,0.0},188,{4.707979284933665e-67,-0.3129179118636492},4.7e-83,3.1e-17},
+{{100.0,0.0},219,{3.55281576252597e-103,-0.2558895779606525},3.6e-119,2.6e-17},
+{{100.0,0.0},254,{4.55657832640485e-149,-0.2136478525051976},4.6e-165,2.1e-17},
+{{100.0,0.0},296,{4.315175622295763e-210,-0.1791296784354242},4.3e-226,1.8e-17},
+{{100.0,0.0},343,{7.268649608327999e-285,-0.1521506868517931},7.3e-301,1.5e-17},
+{{100.0,0.0},399,{1.576548530414267e-381,-0.1292718457785899},1.6e-397,1.3e-17},
+{{100.0,0.0},464,{1.628112757148264e-502,-0.1102273379986514},1.6e-518,1.1e-17},
+{{100.0,0.0},539,{4.022904701566716e-652,-0.09431273058687071},4.0e-668,9.4e-18},
+{{100.0,0.0},626,{3.695061705517215e-837,-0.08084497341960217},3.7e-853,8.1e-18},
+{{100.0,0.0},727,{3.027077507860543e-1065,-0.06938716543204574},3.0e-1081,6.9e-18},
+{{100.0,0.0},844,{9.023599477774656e-1345,-0.05962613741500692},9.0e-1361,6.0e-18},
+{{100.0,0.0},981,{5.134247651002995e-1690,-0.05120891645363667},5.1e-1706,5.1e-18},
+{{100.0,0.0},1139,{7.819360896771125e-2109,-0.04404884175054067},7.8e-2125,4.4e-18},
+{{100.0,0.0},1324,{2.179779980227056e-2623,-0.03785814964222869},2.2e-2639,3.8e-18},
+{{100.0,0.0},1537,{1.351131440487193e-3243,-0.03258932938218371},1.4e-3259,3.3e-18},
+{{1000.0,0.0},0,{0.6837297745504157,-0.4650197522080685},6.8e-17,4.7e-17},
+{{1000.0,0.0},1,{0.3153408696749427,0.4646518276392155},3.2e-17,4.6e-17},
+{{1000.0,0.0},2,{0.6865186287528438,-0.463910401575804},6.9e-17,4.6e-17},
+{{1000.0,0.0},3,{0.3107052121902361,0.4627843423813207},3.1e-17,4.6e-17},
+{{1000.0,0.0},4,{0.6929997456348241,-0.4612570089179194},6.9e-17,4.6e-17},
+{{1000.0,0.0},5,{0.3024089061787186,0.4593063203041767},3.0e-17,4.6e-17},
+{{1000.0,0.0},6,{0.7031076597072864,-0.4569048525372149},7.0e-17,4.6e-17},
+{{1000.0,0.0},7,{0.2905387702685337,0.4540199650394618},2.9e-17,4.5e-17},
+{{1000.0,0.0},9,{0.2752306324835701,0.4466442853347819},2.8e-17,4.5e-17},
+{{1000.0,0.0},10,{0.7337091845202087,-0.4420637672836413},7.3e-17,4.4e-17},
+{{1000.0,0.0},11,{0.2566803850394357,0.4368209101368283},2.6e-17,4.4e-17},
+{{1000.0,0.0},13,{0.2351579017116949,0.4241227006806428},2.4e-17,4.2e-17},
+{{1000.0,0.0},15,{0.211023291057128,0.4080659125735375},2.1e-17,4.1e-17},
+{{1000.0,0.0},18,{0.8291891947671029,-0.3765319396383436},8.3e-17,3.8e-17},
+{{1000.0,0.0},20,{0.8575634644874209,-0.3497549337299916},8.6e-17,3.5e-17},
+{{1000.0,0.0},23,{0.09972596291198461,0.29968021449204},1.0e-17,3.0e-17},
+{{1000.0,0.0},27,{0.04731739666958621,0.212359027919195},4.7e-18,2.1e-17},
+{{1000.0,0.0},31,{0.01021549401741627,0.1005793634384563},1.0e-18,1.0e-17},
+{{1000.0,0.0},35,{0.00107650575783671,-0.0328028311638996},1.1e-19,3.3e-18},
+{{1000.0,0.0},41,{0.06808144133529505,-0.2520020883398875},6.8e-18,2.5e-17},
+{{1000.0,0.0},47,{0.2566841270444542,-0.4371354664741786},2.6e-17,4.4e-17},
+{{1000.0,0.0},54,{0.3986043794455755,0.4902164588520832},4.0e-17,4.9e-17},
+{{1000.0,0.0},62,{0.04536475784626348,0.2083162361002326},4.5e-18,2.1e-17},
+{{1000.0,0.0},71,{0.8583330593128032,0.3518519034467923},8.6e-17,3.5e-17},
+{{1000.0,0.0},81,{0.1638551470566819,0.3708820914899069},1.6e-17,3.7e-17},
+{{1000.0,0.0},93,{0.3537316136673334,-0.4797519457793337},3.5e-17,4.8e-17},
+{{1000.0,0.0},107,{0.796324525113472,0.4084521979134828},8.0e-17,4.1e-17},
+{{1000.0,0.0},123,{0.473532993539322,-0.5029438285687216},4.7e-17,5.0e-17},
+{{1000.0,0.0},141,{3.352971318064491e-5,-0.005819740586015554},3.4e-21,5.8e-19},
+{{1000.0,0.0},162,{1.008701751906824,0.06935481533069809},1.0e-16,6.9e-18},
+{{1000.0,0.0},186,{0.180048185727329,0.3883892039272592},1.8e-17,3.9e-17},
+{{1000.0,0.0},214,{0.7832917805736668,0.4340645318072342},7.8e-17,4.3e-17},
+{{1000.0,0.0},246,{0.009344896452480198,-0.09775022345721083},9.3e-19,9.8e-18},
+{{1000.0,0.0},282,{0.09566847423406349,-0.3009622903033931},9.6e-18,3.0e-17},
+{{1000.0,0.0},324,{0.4322624052566416,-0.5197512105452738},4.3e-17,5.2e-17},
+{{1000.0,0.0},372,{0.8266856879897288,0.4553950981107681},8.3e-17,4.6e-17},
+{{1000.0,0.0},427,{0.9210789099283309,-0.4129025775667674},9.2e-17,4.1e-17},
+{{1000.0,0.0},490,{1.094334343721242,-0.2412611945568023},1.1e-16,2.4e-17},
+{{1000.0,0.0},562,{0.2277347708249827,-0.4728411132919602},2.3e-17,4.7e-17},
+{{1000.0,0.0},645,{0.5103216319784123,0.6385457081259945},5.1e-17,6.4e-17},
+{{1000.0,0.0},740,{1.463456803176647,-0.1893811578643412},1.5e-16,1.9e-17},
+{{1000.0,0.0},850,{1.070057419675087,0.943057044237281},1.1e-16,9.4e-17},
+{{10000.0,0.0},0,{0.09340015469553981,-0.2909923809971475},9.3e-18,2.9e-17},
+{{10000.0,0.0},1,{0.9065416477622623,0.2910736980562846},9.1e-17,2.9e-17},
+{{10000.0,0.0},2,{0.09357482610887712,-0.2912362972481545},9.4e-18,2.9e-17},
+{{10000.0,0.0},3,{0.9062504161524928,0.2914801086711672},9.1e-17,2.9e-17},
+{{10000.0,0.0},4,{0.09398296167406917,-0.2918050273510329},9.4e-18,2.9e-17},
+{{10000.0,0.0},5,{0.9057251756142541,0.2922109130946131},9.1e-17,2.9e-17},
+{{10000.0,0.0},6,{0.09462592521624692,-0.2926975902952848},9.5e-18,2.9e-17},
+{{10000.0,0.0},8,{0.09550585525767662,-0.2939124380683851},9.6e-18,2.9e-17},
+{{10000.0,0.0},11,{0.9027240303429979,0.2963341883460851},9.0e-17,3.0e-17},
+{{10000.0,0.0},14,{0.09960030318021704,-0.2994665045829122},1.0e-17,3.0e-17},
+{{10000.0,0.0},18,{0.1035880988071382,-0.3047257483849394},1.0e-17,3.0e-17},
+{{10000.0,0.0},23,{0.8899283645791489,0.3129829495500489},8.9e-17,3.1e-17},
+{{10000.0,0.0},29,{0.8797814325426485,0.3252228321781845},8.8e-17,3.3e-17},
+{{10000.0,0.0},37,{0.8618146944042639,0.3451031520201578},8.6e-17,3.5e-17},
+{{10000.0,0.0},48,{0.1724090954326228,-0.3777383046653143},1.7e-17,3.8e-17},
+{{10000.0,0.0},61,{0.7704313888104097,0.4205727442627203},7.7e-17,4.2e-17},
+{{10000.0,0.0},78,{0.3363692716177661,-0.4724778817523399},3.4e-17,4.7e-17},
+{{10000.0,0.0},99,{0.4798396969269212,0.4996171694491488},4.8e-17,5.0e-17},
+{{10000.0,0.0},126,{0.8028931330521504,-0.3978944547731133},8.0e-17,4.0e-17},
+{{10000.0,0.0},161,{0.001927595092644426,-0.043864916467029},1.9e-19,4.4e-18},
+{{10000.0,0.0},205,{0.5658917609980439,-0.4957598226301632},5.7e-17,5.0e-17},
+{{10000.0,0.0},262,{0.3325140313656405,-0.471235684776433},3.3e-17,4.7e-17},
+{{10000.0,0.0},333,{0.8408566903346908,-0.3664487902639207},8.4e-17,3.7e-17},
+{{10000.0,0.0},425,{0.9972681502505771,-0.06023613065692369},1.0e-16,6.0e-18},
+{{10000.0,0.0},541,{0.5534184894443579,-0.4979554458661743},5.5e-17,5.0e-17},
+{{10000.0,0.0},690,{0.6850261734907807,0.4662662825831345},6.9e-17,4.7e-17},
+{{10000.0,0.0},879,{0.06551997148993641,0.2479556200383764},6.6e-18,2.5e-17},
+{{10000.0,0.0},1120,{0.09997588377138737,-0.3010220712286921},1.0e-17,3.0e-17},
+{{10000.0,0.0},1427,{0.07225004027180862,-0.2603412314142506},7.2e-18,2.6e-17},
+{{10000.0,0.0},1818,{0.1444844409935434,0.3550473623349676},1.4e-17,3.6e-17},
+{{10000.0,0.0},2316,{0.1131423986903273,0.3217216392052926},1.1e-17,3.2e-17},
+{{10000.0,0.0},2950,{0.7375893855015257,0.4774068891965172},7.4e-17,4.8e-17},
+{{10000.0,0.0},3758,{0.7295094874056862,0.5050194001878059},7.3e-17,5.1e-17},
+{{10000.0,0.0},7771,{1.393783594190213,0.5216596072932137},1.4e-16,5.2e-17},
+{{10000.0,0.0},9900,{3.054882133083072,-3.515728703390099},3.1e-16,3.5e-16},
+{{10000.0,0.0},12612,{5.259118880887656e-1081,-0.6505303817266899},5.3e-1097,6.5e-17},
+{{10000.0,0.0},16067,{1.875396214656035e-3764,-0.3975716628897144},1.9e-3780,4.0e-17},
+{{10000.0,0.0},20468,{1.924146357973163e-8376,-0.279964031645995},1.9e-8392,2.8e-17},
+{{10000.0,0.0},26075,{1.157843898345592e-15607,-0.2076259248583011},1.2e-15623,2.1e-17},
+{{10000.0,0.0},33218,{2.15393474856725e-26448,-0.1578403662281815},2.2e-26464,1.6e-17},
+{{10000.0,0.0},42318,{2.965193381418733e-42267,-0.1215952932656555},3.0e-42283,1.2e-17},
+{{10000.0,0.0},53911,{1.067016016683514e-64929,-0.09438247522268317},1.1e-64945,9.4e-18},
+{{10000.0,0.0},68679,{7.70341454263852e-96960,-0.07358613728379516},7.7e-96976,7.4e-18},
+{{10000.0,0.0},87493,{7.946317443364444e-141765,-0.05752406062448876},7.9e-141781,5.8e-18},
+{{10000.0,0.0},111461,{6.863941818773283e-203918,-0.04504017247767002},6.9e-203934,4.5e-18},
+{{10000.0,0.0},141995,{3.391815853006694e-289545,-0.03530003015880046},3.4e-289561,3.5e-18},
+};
+
+// complex(z), n, complex(f(n,z)), abs_err_real, abs_err_imag
+std::vector< std::tuple< std::complex<double>, int, std::complex<double>, double, double > >
 psi_test_16digits
 = {
 {{0.055,0.0},0,{0.05497227502706773,0.0},5.5e-18,0.0},
@@ -1876,6 +2103,233 @@ psi_test_16digits
 
 // complex(z), n, complex(f(n,z)), abs_err_real, abs_err_imag
 std::vector< std::tuple< std::complex<double>, int, std::complex<double>, double, double > >
+xi_test_16digits
+= {
+{{0.055,0.0},0,{0.9984878812375984,0.0},1.0e-16,0.0},
+{{0.055,0.0},1,{18.20929738843795,0.0},1.8e-15,0.0},
+{{0.055,0.0},2,{992.2359151244687,0.0},9.9e-14,0.0},
+{{0.055,0.0},3,{90185.05571392689,0.0},9.0e-12,0.0},
+{{0.055,0.0},4,{11477105.76403921,0.0},1.1e-9,0.0},
+{{0.055,0.0},5,{1877981667.241611,0.0},1.9e-7,0.0},
+{{0.056,0.0},0,{0.9984324097278344,0.0},1.0e-16,0.0},
+{{0.056,0.0},1,{17.88512090896708,0.0},1.8e-15,0.0},
+{{0.056,0.0},2,{957.1330448563659,0.0},9.6e-14,0.0},
+{{0.056,0.0},3,{85440.42245555228,0.0},8.5e-12,0.0},
+{{0.056,0.0},4,{10679095.67389918,0.0},1.1e-9,0.0},
+{{0.056,0.0},5,{1716197792.88277,0.0},1.7e-7,0.0},
+{{0.099,0.0},0,{0.9951035011759925,0.0},1.0e-16,0.0},
+{{0.099,0.0},1,{10.1503888796599,0.0},1.0e-15,0.0},
+{{0.099,0.0},2,{306.5924383066997,0.0},3.1e-14,0.0},
+{{0.099,0.0},3,{15474.31619226679,0.0},1.5e-12,0.0},
+{{0.099,0.0},4,{1093836.97671187,0.0},1.1e-10,0.0},
+{{0.101,0.0},0,{0.9949038343759767,0.0},9.9e-17,0.0},
+{{0.101,0.0},1,{9.951361384353099,0.0},1.0e-15,0.0},
+{{0.101,0.0},2,{294.5900877800725,0.0},2.9e-14,0.0},
+{{0.101,0.0},3,{14573.71635050042,0.0},1.5e-12,0.0},
+{{0.101,0.0},4,{1009764.958956804,0.0},1.0e-10,0.0},
+{{1.0,0.0},0,{0.5403023058681397,0.0},5.4e-17,0.0},
+{{1.0,0.0},1,{1.381773290676036,0.0},1.4e-16,0.0},
+{{1.0,0.0},2,{3.605017566159969,0.0},3.6e-16,0.0},
+{{1.0,0.0},3,{16.64331454012381,0.0},1.7e-15,0.0},
+{{1.0,0.0},4,{112.8981842147067,0.0},1.1e-14,0.0},
+{{1.0,0.0},5,{999.4403433922364,0.0},1.0e-13,0.0},
+{{1.0,0.0},6,{10880.94559309989,0.0},1.1e-12,0.0},
+{{1.0,0.0},7,{140452.8523669064,0.0},1.4e-11,0.0},
+{{1.0,0.0},8,{2095911.839910496,0.0},2.1e-10,0.0},
+{{1.0,0.0},9,{35490048.42611152,0.0},3.5e-9,0.0},
+{{1.0,0.0},10,{672215008.2562084,0.0},6.7e-8,0.0},
+{{1.0,0.0},11,{14081025124.95427,0.0},1.4e-6,0.0},
+{{1.0,0.0},12,{323191362865.6919,0.0},3.2e-5,0.0},
+{{1.0,0.0},13,{8065703046517.343,0.0},0.00081,0.0},
+{{1.0,0.0},14,{217450790893102.6,0.0},0.022,0.0},
+{{1.0,0.0},15,{6298007232853457.0,0.0},0.63,0.0},
+{{1.0,0.0},16,{1.950207734275641e+17,0.0},20.0,0.0},
+{{1.0,0.0},17,{6.429387515876761e+18,0.0},6.4e+2,0.0},
+{{1.0,0.0},19,{8.312411676927709e+21,0.0},8.3e+5,0.0},
+{{1.0,0.0},20,{3.239592218578984e+23,0.0},3.2e+7,0.0},
+{{1.0,0.0},22,{5.704587152115091e+26,0.0},5.7e+10,0.0},
+{{1.0,0.0},24,{1.205325845219959e+30,0.0},1.2e+14,0.0},
+{{1.0,0.0},26,{3.009595435582847e+33,0.0},3.0e+17,0.0},
+{{1.0,0.0},28,{8.766714157290797e+36,0.0},8.8e+20,0.0},
+{{1.0,0.0},30,{2.946428547496782e+40,0.0},2.9e+24,0.0},
+{{1.0,0.0},32,{1.131703135696075e+44,0.0},1.1e+28,0.0},
+{{1.0,0.0},35,{3.398364364339443e+49,0.0},3.4e+33,0.0},
+{{1.0,0.0},38,{1.320263364413848e+55,0.0},1.3e+39,0.0},
+{{1.0,0.0},41,{6.502028762468467e+60,0.0},6.5e+44,0.0},
+{{10.0,0.0},0,{-0.8390715290764525,0.0},8.4e-17,0.0},
+{{10.0,0.0},1,{-0.6279282637970151,0.0},6.3e-17,0.0},
+{{10.0,0.0},2,{0.6506930499373479,0.0},6.5e-17,0.0},
+{{10.0,0.0},3,{0.953274788765689,0.0},9.5e-17,0.0},
+{{10.0,0.0},4,{0.01659930219863438,0.0},1.7e-18,0.0},
+{{10.0,0.0},5,{-0.9383354167869181,0.0},9.4e-17,0.0},
+{{10.0,0.0},6,{-1.048768260664244,0.0},1.0e-16,0.0},
+{{10.0,0.0},7,{-0.4250633220765995,0.0},4.3e-17,0.0},
+{{10.0,0.0},8,{0.4111732775493451,0.0},4.1e-17,0.0},
+{{10.0,0.0},9,{1.124057893910486,0.0},1.1e-16,0.0},
+{{10.0,0.0},10,{1.724536720880578,0.0},1.7e-16,0.0},
+{{10.0,0.0},11,{2.497469219938729,0.0},2.5e-16,0.0},
+{{10.0,0.0},12,{4.019642484978498,0.0},4.0e-16,0.0},
+{{10.0,0.0},13,{7.551636992507515,0.0},7.6e-16,0.0},
+{{10.0,0.0},14,{16.36977739479179,0.0},1.6e-15,0.0},
+{{10.0,0.0},16,{107.3844467076131,0.0},1.1e-14,0.0},
+{{10.0,0.0},17,{314.4479566827347,0.0},3.1e-14,0.0},
+{{10.0,0.0},18,{993.1834016819582,0.0},9.9e-14,0.0},
+{{10.0,0.0},19,{3360.330629540511,0.0},3.4e-13,0.0},
+{{10.0,0.0},21,{46299.30418991622,0.0},4.6e-12,0.0},
+{{10.0,0.0},22,{186974.9019631137,0.0},1.9e-11,0.0},
+{{10.0,0.0},24,{3549937.544864135,0.0},3.5e-10,0.0},
+{{10.0,0.0},26,{81108054.15260572,0.0},8.1e-9,0.0},
+{{10.0,0.0},27,{413273080.7936202,0.0},4.1e-8,0.0},
+{{10.0,0.0},30,{69083186460.94516,0.0},6.9e-6,0.0},
+{{80.0,0.0},0,{-0.1103872438390476,0.0},1.1e-17,0.0},
+{{80.0,0.0},1,{-0.9952684944713633,0.0},1.0e-16,0.0},
+{{80.0,0.0},30,{0.5060739517940013,0.0},5.1e-17,0.0},
+{{80.0,0.0},50,{0.7514741282998871,0.0},7.5e-17,0.0},
+{{80.0,0.0},60,{-1.056795272698575,0.0},1.1e-16,0.0},
+{{80.0,0.0},70,{-1.082903079393562,0.0},1.1e-16,0.0},
+{{80.0,0.0},75,{-0.2861031097638479,0.0},2.9e-17,0.0},
+{{80.0,0.0},80,{2.229727207344475,0.0},2.2e-16,0.0},
+{{80.0,0.0},85,{6.79766591437198,0.0},6.8e-16,0.0},
+{{80.0,0.0},90,{49.68517113491355,0.0},5.0e-15,0.0},
+{{80.0,0.0},99,{9222.855138429382,0.0},9.2e-13,0.0},
+{{80.0,0.0},116,{7395385511.699251,0.0},7.4e-7,0.0},
+{{80.0,0.0},130,{7978214064656749.0,0.0},0.8,0.0},
+{{100.0,0.0},0,{0.8623188722876839,0.0},8.6e-17,0.0},
+{{100.0,0.0},1,{-0.497742452386882,0.0},5.0e-17,0.0},
+{{100.0,0.0},2,{-0.8772511458592904,0.0},8.8e-17,0.0},
+{{100.0,0.0},3,{0.4538798950939174,0.0},4.5e-17,0.0},
+{{100.0,0.0},4,{0.9090227385158646,0.0},9.1e-17,0.0},
+{{100.0,0.0},5,{-0.3720678486274896,0.0},3.7e-17,0.0},
+{{100.0,0.0},6,{-0.9499502018648885,0.0},9.5e-17,0.0},
+{{100.0,0.0},7,{0.2485743223850541,0.0},2.5e-17,0.0},
+{{100.0,0.0},8,{0.9872363502226466,0.0},9.9e-17,0.0},
+{{100.0,0.0},9,{-0.0807441428472042,0.0},8.1e-18,0.0},
+{{100.0,0.0},10,{-1.002577737363615,0.0},1.0e-16,0.0},
+{{100.0,0.0},12,{0.9727243855038097,0.0},9.7e-17,0.0},
+{{100.0,0.0},14,{-0.8720202503425307,0.0},8.7e-17,0.0},
+{{100.0,0.0},17,{0.8496049309427912,0.0},8.5e-17,0.0},
+{{100.0,0.0},19,{-0.9904419668956676,0.0},9.9e-17,0.0},
+{{100.0,0.0},23,{-0.794394952285829,0.0},7.9e-17,0.0},
+{{100.0,0.0},26,{1.008142711740272,0.0},1.0e-16,0.0},
+{{100.0,0.0},31,{0.9967036472620608,0.0},1.0e-16,0.0},
+{{100.0,0.0},36,{1.033265431104683,0.0},1.0e-16,0.0},
+{{100.0,0.0},42,{0.7454135574907433,0.0},7.5e-17,0.0},
+{{100.0,0.0},49,{-0.5855924676754787,0.0},5.9e-17,0.0},
+{{100.0,0.0},57,{-0.7917840064320207,0.0},7.9e-17,0.0},
+{{100.0,0.0},66,{0.9943577408622831,0.0},9.9e-17,0.0},
+{{100.0,0.0},76,{0.758958460609405,0.0},7.6e-17,0.0},
+{{100.0,0.0},89,{-0.9874911064736249,0.0},9.9e-17,0.0},
+{{100.0,0.0},103,{3.932782745345558,0.0},3.9e-16,0.0},
+{{100.0,0.0},120,{7123.747314608973,0.0},7.1e-13,0.0},
+{{100.0,0.0},140,{22728970587.22979,0.0},2.3e-6,0.0},
+{{100.0,0.0},162,{3.998455948928182e+19,0.0},4.0e+3,0.0},
+{{100.0,0.0},188,{4.560507264377804e+32,0.0},4.6e+16,0.0},
+{{100.0,0.0},219,{4.293053043714103e+50,0.0},4.3e+34,0.0},
+{{100.0,0.0},254,{3.165039335082101e+73,0.0},3.2e+57,0.0},
+{{100.0,0.0},296,{8.62319701238945e+103,0.0},8.6e+87,0.0},
+{{100.0,0.0},343,{1.784625319681049e+141,0.0},1.8e+125,0.0},
+{{100.0,0.0},399,{3.255744216903431e+189,0.0},3.3e+173,0.0},
+{{100.0,0.0},464,{8.638673889350171e+249,0.0},8.6e+233,0.0},
+{{100.0,0.0},539,{4.702192956140304e+324,0.0},4.7e+308,0.0},
+{{100.0,0.0},626,{1.329971011220177e+417,0.0},1.3e+401,0.0},
+{{100.0,0.0},727,{1.261151833780533e+531,0.0},1.3e+515,0.0},
+{{100.0,0.0},844,{6.276922570590454e+670,0.0},6.3e+654,0.0},
+{{100.0,0.0},981,{2.259993447656205e+843,0.0},2.3e+827,0.0},
+{{100.0,0.0},1139,{4.981370725943817e+1052,0.0},5.0e+1036,0.0},
+{{100.0,0.0},1324,{8.108733995411389e+1309,0.0},8.1e+1293,0.0},
+{{100.0,0.0},1537,{8.865977477340542e+1619,0.0},8.9e+1603,0.0},
+{{1000.0,0.0},0,{0.562379076290703,0.0},5.6e-17,0.0},
+{{1000.0,0.0},1,{0.8274419196082933,0.0},8.3e-17,0.0},
+{{1000.0,0.0},2,{-0.5598967505318781,0.0},5.6e-17,0.0},
+{{1000.0,0.0},3,{-0.8302414033609527,0.0},8.3e-17,0.0},
+{{1000.0,0.0},4,{0.5540850607083514,0.0},5.5e-17,0.0},
+{{1000.0,0.0},5,{0.8352281689073278,0.0},8.4e-17,0.0},
+{{1000.0,0.0},6,{-0.5448975508503708,0.0},5.4e-17,0.0},
+{{1000.0,0.0},7,{-0.8423118370683826,0.0},8.4e-17,0.0},
+{{1000.0,0.0},9,{0.8513603059143865,0.0},8.5e-17,0.0},
+{{1000.0,0.0},10,{-0.5160870274819718,0.0},5.2e-17,0.0},
+{{1000.0,0.0},11,{-0.8621981334915079,0.0},8.6e-17,0.0},
+{{1000.0,0.0},13,{0.8746045452517996,0.0},8.7e-17,0.0},
+{{1000.0,0.0},15,{-0.8883111675348058,0.0},8.9e-17,0.0},
+{{1000.0,0.0},18,{-0.4134995149333431,0.0},4.1e-17,0.0},
+{{1000.0,0.0},20,{0.3776858501060111,0.0},3.8e-17,0.0},
+{{1000.0,0.0},23,{-0.9489732087840213,0.0},9.5e-17,0.0},
+{{1000.0,0.0},27,{-0.976248337884936,0.0},9.8e-17,0.0},
+{{1000.0,0.0},31,{-0.9951285718767434,0.0},1.0e-16,0.0},
+{{1000.0,0.0},35,{-0.9997770197744073,0.0},1.0e-16,0.0},
+{{1000.0,0.0},41,{0.9658057107645263,0.0},9.7e-17,0.0},
+{{1000.0,0.0},47,{-0.8628127163075355,0.0},8.6e-17,0.0},
+{{1000.0,0.0},54,{0.7764560092822195,0.0},7.8e-17,0.0},
+{{1000.0,0.0},62,{0.9780562249615457,0.0},9.8e-17,0.0},
+{{1000.0,0.0},71,{0.379779907874921,0.0},3.8e-17,0.0},
+{{1000.0,0.0},81,{-0.9162327671042002,0.0},9.2e-17,0.0},
+{{1000.0,0.0},93,{-0.8066400984512723,0.0},8.1e-17,0.0},
+{{1000.0,0.0},107,{-0.4577161030388435,0.0},4.6e-17,0.0},
+{{1000.0,0.0},123,{-0.7308771114070519,0.0},7.3e-17,0.0},
+{{1000.0,0.0},141,{-1.00505240530667,0.0},1.0e-16,0.0},
+{{1000.0,0.0},162,{0.06905501630232919,0.0},6.9e-18,0.0},
+{{1000.0,0.0},186,{-0.9153196261481822,0.0},9.2e-17,0.0},
+{{1000.0,0.0},214,{-0.4904474893116481,0.0},4.9e-17,0.0},
+{{1000.0,0.0},246,{-1.011184752036795,0.0},1.0e-16,0.0},
+{{1000.0,0.0},282,{0.973033201417064,0.0},9.7e-17,0.0},
+{{1000.0,0.0},324,{-0.7905362270426355,0.0},7.9e-17,0.0},
+{{1000.0,0.0},372,{-0.500862067695031,0.0},5.0e-17,0.0},
+{{1000.0,0.0},427,{0.4302284984951585,0.0},4.3e-17,0.0},
+{{1000.0,0.0},490,{0.2306282264858935,0.0},2.3e-17,0.0},
+{{1000.0,0.0},562,{-0.9908332203529922,0.0},9.9e-17,0.0},
+{{1000.0,0.0},645,{-0.8938610251077628,0.0},8.9e-17,0.0},
+{{1000.0,0.0},740,{0.1565477440422447,0.0},1.6e-17,0.0},
+{{1000.0,0.0},850,{0.9116631948399486,0.0},9.1e-17,0.0},
+{{10000.0,0.0},0,{-0.9521553682590149,0.0},9.5e-17,0.0},
+{{10000.0,0.0},1,{-0.305709604425078,0.0},3.1e-17,0.0},
+{{10000.0,0.0},2,{0.9520636553776873,0.0},9.5e-17,0.0},
+{{10000.0,0.0},3,{0.3061856362527669,0.0},3.1e-17,0.0},
+{{10000.0,0.0},4,{-0.9518493254323104,0.0},9.5e-17,0.0},
+{{10000.0,0.0},5,{-0.307042300645656,0.0},3.1e-17,0.0},
+{{10000.0,0.0},6,{0.9515115789016002,0.0},9.5e-17,0.0},
+{{10000.0,0.0},8,{-0.9510491600030528,0.0},9.5e-17,0.0},
+{{10000.0,0.0},11,{0.3118920160210031,0.0},3.1e-17,0.0},
+{{10000.0,0.0},14,{0.9488944866640447,0.0},9.5e-17,0.0},
+{{10000.0,0.0},18,{0.946791218377749,0.0},9.5e-17,0.0},
+{{10000.0,0.0},23,{0.3317746154126867,0.0},3.3e-17,0.0},
+{{10000.0,0.0},29,{-0.3467317659022176,0.0},3.5e-17,0.0},
+{{10000.0,0.0},37,{-0.3717422973913016,0.0},3.7e-17,0.0},
+{{10000.0,0.0},48,{-0.9097266978464748,0.0},9.1e-17,0.0},
+{{10000.0,0.0},61,{-0.4791529210238686,0.0},4.8e-17,0.0},
+{{10000.0,0.0},78,{0.8146542455580336,0.0},8.1e-17,0.0},
+{{10000.0,0.0},99,{0.7212557152272793,0.0},7.2e-17,0.0},
+{{10000.0,0.0},126,{0.44405730097627,0.0},4.4e-17,0.0},
+{{10000.0,0.0},161,{-0.9991010161245437,0.0},1.0e-16,0.0},
+{{10000.0,0.0},205,{-0.659029176819063,0.0},6.6e-17,0.0},
+{{10000.0,0.0},262,{-0.8172090777658204,0.0},8.2e-17,0.0},
+{{10000.0,0.0},333,{0.3996246788860864,0.0},4.0e-17,0.0},
+{{10000.0,0.0},425,{-0.06031857764924985,0.0},6.0e-18,0.0},
+{{10000.0,0.0},541,{-0.6693660079881031,0.0},6.7e-17,0.0},
+{{10000.0,0.0},690,{0.5633527627627941,0.0},5.6e-17,0.0},
+{{10000.0,0.0},879,{0.9686951076386396,0.0},9.7e-17,0.0},
+{{10000.0,0.0},1120,{-0.9520301748728291,0.0},9.5e-17,0.0},
+{{10000.0,0.0},1427,{0.9685541537392371,0.0},9.7e-17,0.0},
+{{10000.0,0.0},1818,{-0.9340620975427486,0.0},9.3e-17,0.0},
+{{10000.0,0.0},2316,{-0.9564616952166914,0.0},9.6e-17,0.0},
+{{10000.0,0.0},2950,{0.555880388869997,0.0},5.6e-17,0.0},
+{{10000.0,0.0},3758,{0.591279183531158,0.0},5.9e-17,0.0},
+{{10000.0,0.0},7771,{0.4418649322239787,0.0},4.4e-17,0.0},
+{{10000.0,0.0},9900,{-2.011491146878234,0.0},2.0e-16,0.0},
+{{10000.0,0.0},12612,{8.970385150483627e+539,0.0},9.0e+523,0.0},
+{{10000.0,0.0},16067,{2.90314618431218e+1881,0.0},2.9e+1865,0.0},
+{{10000.0,0.0},20468,{2.018288229524841e+4187,0.0},2.0e+4171,0.0},
+{{10000.0,0.0},26075,{6.101780411131719e+7802,0.0},6.1e+7786,0.0},
+{{10000.0,0.0},33218,{1.075478687761038e+13223,0.0},1.1e+13207,0.0},
+{{10000.0,0.0},42318,{2.233007868840026e+21132,0.0},2.2e+21116,0.0},
+{{10000.0,0.0},53911,{2.889388190778695e+32463,0.0},2.9e+32447,0.0},
+{{10000.0,0.0},68679,{2.651272528165235e+48478,0.0},2.7e+48462,0.0},
+{{10000.0,0.0},87493,{6.453073029871699e+70880,0.0},6.5e+70864,0.0},
+{{10000.0,0.0},111461,{1.71914792791431e+101957,0.0},1.7e+101941,0.0},
+{{10000.0,0.0},141995,{6.061204591967546e+144770,0.0},6.1e+144754,0.0},
+};
+
+// complex(z), n, complex(f(n,z)), abs_err_real, abs_err_imag
+std::vector< std::tuple< std::complex<double>, int, std::complex<double>, double, double > >
 zeta_test_16digits
 = {
 {{0.055,0.0},0,{0.05497227502706773,-0.9984878812375984},5.5e-18,1.0e-16},