32std::complex<double>
Werrf(std::complex<double> z) {
33 const double cc = 1.12837916709551;
34 const double xlim = 5.33;
35 const double ylim = 4.29;
37 const double x = std::abs(std::real(z));
38 const double y = std::abs(std::imag(z));
39 std::complex<double> w;
41 if(y < ylim && x < xlim) {
43 const double q = (1.0 - y / ylim) *
sqrt(1.0 - (x * x) / (xlim * xlim));
45 const int nc = 6 + int(23.0 * q);
46 const int nu = 9 + int(21.0 * q);
47 const std::complex<double> zz(1.6 * q + y, - x);
50 std::complex<double> r(0.0);
51 for(
int n = nu; n > nc; n--) {
52 r = 0.5 / (zz + double(n + 1) * r);
56 double power =
pow(3.2 * q, nc);
57 const double div = 0.3125 / q;
58 std::complex<double> s(0.0);
59 for(
int n = nc; n >= 0; n--) {
60 r = 0.5 / (zz + double(n + 1) * r);
69 const std::complex<double> zz(y, - x);
70 std::complex<double> r(0.0);
71 for(
int n = 8; n >= 0; n--) {
72 r = 0.5 / (zz + double(n + 1) * r);
80 if(std::imag(z) < 0.0) {
81 std::complex<double> zz(x, y);
82 w = 2.0 * std::exp(- zz * zz) - w;
83 if(std::real(z) > 0.0) w = std::conj(w);
85 if(std::real(z) < 0.0) w = std::conj(w);