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