1 /* Copyright (c) 2012 Massachusetts Institute of Technology
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining
4  * a copy of this software and associated documentation files (the
5  * "Software"), to deal in the Software without restriction, including
6  * without limitation the rights to use, copy, modify, merge, publish,
7  * distribute, sublicense, and/or sell copies of the Software, and to
8  * permit persons to whom the Software is furnished to do so, subject to
9  * the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be
12  * included in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22 
23 #include "Faddeeva.hh"
24 
25 /* Available at: http://ab-initio.mit.edu/Faddeeva
26 
27    Computes various error functions (erf, erfc, erfi, erfcx),
28    including the Dawson integral, in the complex plane, based
29    on algorithms for the computation of the Faddeeva function
30               w(z) = exp(-z^2) * erfc(-i*z).
31    Given w(z), the error functions are mostly straightforward
32    to compute, except for certain regions where we have to
33    switch to Taylor expansions to avoid cancellation errors
34    [e.g. near the origin for erf(z)].
35 
36    To compute the Faddeeva function, we use a combination of two
37    algorithms:
38 
39    For sufficiently large |z|, we use a continued-fraction expansion
40    for w(z) similar to those described in:
41 
42       Walter Gautschi, "Efficient computation of the complex error
43       function," SIAM J. Numer. Anal. 7(1), pp. 187-198 (1970)
44 
45       G. P. M. Poppe and C. M. J. Wijers, "More efficient computation
46       of the complex error function," ACM Trans. Math. Soft. 16(1),
47       pp. 38-46 (1990).
48 
49    Unlike those papers, however, we switch to a completely different
50    algorithm for smaller |z|:
51 
52       Mofreh R. Zaghloul and Ahmed N. Ali, "Algorithm 916: Computing the
53       Faddeyeva and Voigt Functions," ACM Trans. Math. Soft. 38(2), 15
54       (2011).
55 
56    (I initially used this algorithm for all z, but it turned out to be
57     significantly slower than the continued-fraction expansion for
58     larger |z|.  On the other hand, it is competitive for smaller |z|,
59     and is significantly more accurate than the Poppe & Wijers code
60     in some regions, e.g. in the vicinity of z=1+1i.)
61 
62    Note that this is an INDEPENDENT RE-IMPLEMENTATION of these algorithms,
63    based on the description in the papers ONLY.  In particular, I did
64    not refer to the authors' Fortran or Matlab implementations, respectively,
65    (which are under restrictive ACM copyright terms and therefore unusable
66     in free/open-source software).
67 
68    Steven G. Johnson, Massachusetts Institute of Technology
69    http://math.mit.edu/~stevenj
70    October 2012.
71 
72     -- Note that Algorithm 916 assumes that the erfc(x) function,
73        or rather the scaled function erfcx(x) = exp(x*x)*erfc(x),
74        is supplied for REAL arguments x.   I originally used an
75        erfcx routine derived from DERFC in SLATEC, but I have
76        since replaced it with a much faster routine written by
77        me which uses a combination of continued-fraction expansions
78        and a lookup table of Chebyshev polynomials.  For speed,
79        I implemented a similar algorithm for Im[w(x)] of real x,
80        since this comes up frequently in the other error functions.
81 
82    A small test program is included the end, which checks
83    the w(z) etc. results against several known values.  To compile
84    the test function, compile with -DTEST_FADDEEVA (that is,
85    #define TEST_FADDEEVA).
86 
87    REVISION HISTORY:
88        4 October 2012: Initial public release (SGJ)
89        5 October 2012: Revised (SGJ) to fix spelling error,
90                        start summation for large x at round(x/a) (> 1)
91 		       rather than ceil(x/a) as in the original
92 		       paper, which should slightly improve performance
93      		       (and, apparently, slightly improves accuracy)
94       19 October 2012: Revised (SGJ) to fix bugs for large x, large -y,
95                        and 15<x<26. Performance improvements. Prototype
96 		       now supplies default value for relerr.
97       24 October 2012: Switch to continued-fraction expansion for
98                        sufficiently large z, for performance reasons.
99 		       Also, avoid spurious overflow for |z| > 1e154.
100 		       Set relerr argument to min(relerr,0.1).
101       27 October 2012: Enhance accuracy in Re[w(z)] taken by itself,
102                        by switching to Alg. 916 in a region near
103 		       the real-z axis where continued fractions
104 		       have poor relative accuracy in Re[w(z)].  Thanks
105 		       to M. Zaghloul for the tip.
106       29 October 2012: Replace SLATEC-derived erfcx routine with
107                        completely rewritten code by me, using a very
108 		       different algorithm which is much faster.
109       30 October 2012: Implemented special-case code for real z
110                        (where real part is exp(-x^2) and imag part is
111 		        Dawson integral), using algorithm similar to erfx.
112 		       Export ImFaddeeva_w function to make Dawson's
113 		       integral directly accessible.
114       3 November 2012: Provide implementations of erf, erfc, erfcx,
115                        and Dawson functions in Faddeeva:: namespace,
116 		       in addition to Faddeeva::w.  Provide header
117 		       file Faddeeva.hh.
118 */
119 
120 #include <Python.h>
121 extern "C" {
122 #include <numpy/npy_math.h>
123 }
124 
125 #include <cfloat>
126 #include <cmath>
127 
128 #define complex std::complex
129 
130 /////////////////////////////////////////////////////////////////////////
131 
132 // use numpy's versions, since std:: versions only available in C++11
133 #define my_copysign npy_copysign
134 #define Inf NPY_INFINITY
135 #define NaN NPY_NAN
136 
137 /*
138  * portable isnan/isinf; in cmath only available in C++11 and npy_math
139  * versions don't work well (they get undef'd by cmath, see gh-5689)
140  * Implementation based on npy_math.h
141  */
142 #define my_isnan(x) ((x) != (x))
143 #ifdef _MSC_VER
144     #define my_isfinite(x) _finite((x))
145 #else
146     #define my_isfinite(x) !my_isnan((x) + (-x))
147 #endif
148 #define my_isinf(x) (!my_isfinite(x) && !my_isnan(x))
149 
150 /////////////////////////////////////////////////////////////////////////
151 // Auxiliary routines to compute other special functions based on w(z)
152 
153 // compute erfcx(z) = exp(z^2) erfz(z)
erfcx(complex<double> z,double relerr)154 complex<double> Faddeeva::erfcx(complex<double> z, double relerr)
155 {
156   return Faddeeva::w(complex<double>(-imag(z), real(z)));
157 }
158 
159 // compute the error function erf(x)
erf(double x)160 double Faddeeva::erf(double x)
161 {
162   double mx2 = -x*x;
163   if (mx2 < -750) // underflow
164     return (x >= 0 ? 1.0 : -1.0);
165 
166   if (x >= 0) {
167     if (x < 5e-3) goto taylor;
168     return 1.0 - exp(mx2) * Faddeeva::erfcx(x);
169   }
170   else { // x < 0
171     if (x > -5e-3) goto taylor;
172     return exp(mx2) * Faddeeva::erfcx(-x) - 1.0;
173   }
174 
175   // Use Taylor series for small |x|, to avoid cancellation inaccuracy
176   //     erf(x) = 2/sqrt(pi) * x * (1 - x^2/3 + x^4/10 - ...)
177  taylor:
178   return x * (1.1283791670955125739
179 	      + mx2 * (0.37612638903183752464
180 		       + mx2 * 0.11283791670955125739));
181 }
182 
183 // compute the error function erf(z)
erf(complex<double> z,double relerr)184 complex<double> Faddeeva::erf(complex<double> z, double relerr)
185 {
186   double x = real(z), y = imag(z);
187 
188   if (x == 0) // handle separately for speed & handling of y = Inf or NaN
189     return complex<double>(x, // preserve sign of 0
190 			   /* handle y -> Inf limit manually, since
191 			      exp(y^2) -> Inf but Im[w(y)] -> 0, so
192 			      IEEE will give us a NaN when it should be Inf */
193 			   y*y > 720 ? (y > 0 ? Inf : -Inf)
194 			   : exp(y*y) * Faddeeva::w_im(y));
195 
196   double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
197   double mIm_z2 = -2*x*y; // Im(-z^2)
198   if (mRe_z2 < -750) // underflow
199     return (x >= 0 ? 1.0 : -1.0);
200 
201   /* Handle positive and negative x via different formulas,
202      using the mirror symmetries of w, to avoid overflow/underflow
203      problems from multiplying exponentially large and small quantities. */
204   if (x >= 0) {
205     if (x < 5e-3) {
206       if (fabs(y) < 5e-3)
207 	goto taylor;
208       else if (fabs(mIm_z2) < 5e-3)
209 	goto taylor_erfi;
210     }
211     /* don't use complex exp function, since that will produce spurious NaN
212        values when multiplying w in an overflow situation. */
213     return 1.0 - exp(mRe_z2) *
214       (complex<double>(cos(mIm_z2), sin(mIm_z2))
215        * Faddeeva::w(complex<double>(-y,x)));
216   }
217   else { // x < 0
218     if (x > -5e-3) { // duplicate from above to avoid fabs(x) call
219       if (fabs(y) < 5e-3)
220 	goto taylor;
221       else if (fabs(mIm_z2) < 5e-3)
222 	goto taylor_erfi;
223     }
224     else if (my_isnan(x))
225       return complex<double>(NaN, y == 0 ? 0 : NaN);
226     /* don't use complex exp function, since that will produce spurious NaN
227        values when multiplying w in an overflow situation. */
228     return exp(mRe_z2) *
229       (complex<double>(cos(mIm_z2), sin(mIm_z2))
230        * Faddeeva::w(complex<double>(y,-x))) - 1.0;
231   }
232 
233   // Use Taylor series for small |z|, to avoid cancellation inaccuracy
234   //     erf(z) = 2/sqrt(pi) * z * (1 - z^2/3 + z^4/10 - ...)
235  taylor:
236   {
237     complex<double> mz2(mRe_z2, mIm_z2); // -z^2
238     return z * (1.1283791670955125739
239 		+ mz2 * (0.37612638903183752464
240 			 + mz2 * 0.11283791670955125739));
241   }
242 
243   /* for small |x| and small |xy|,
244      use Taylor series to avoid cancellation inaccuracy:
245        erf(x+iy) = erf(iy)
246           + 2*exp(y^2)/sqrt(pi) *
247 	    [ x * (1 - x^2 * (1+2y^2)/3 + x^4 * (3+12y^2+4y^4)/30 + ...
248               - i * x^2 * y * (1 - x^2 * (3+2y^2)/6 + ...) ]
249      where:
250         erf(iy) = exp(y^2) * Im[w(y)]
251   */
252  taylor_erfi:
253   {
254     double x2 = x*x, y2 = y*y;
255     double expy2 = exp(y2);
256     return complex<double>
257       (expy2 * x * (1.1283791670955125739
258 		    - x2 * (0.37612638903183752464
259 			    + 0.75225277806367504925*y2)
260 		    + x2*x2 * (0.11283791670955125739
261 			       + y2 * (0.45135166683820502956
262 				       + 0.15045055561273500986*y2))),
263        expy2 * (Faddeeva::w_im(y)
264 		- x2*y * (1.1283791670955125739
265 			  - x2 * (0.56418958354775628695
266 				  + 0.37612638903183752464*y2))));
267   }
268 }
269 
270 // erfi(z) = -i erf(iz)
erfi(complex<double> z,double relerr)271 complex<double> Faddeeva::erfi(complex<double> z, double relerr)
272 {
273   complex<double> e = Faddeeva::erf(complex<double>(-imag(z),real(z)), relerr);
274   return complex<double>(imag(e), -real(e));
275 }
276 
277 // erfi(x) = -i erf(ix)
erfi(double x)278 double Faddeeva::erfi(double x)
279 {
280   return x*x > 720 ? (x > 0 ? Inf : -Inf)
281     : exp(x*x) * Faddeeva::w_im(x);
282 }
283 
284 // erfc(x) = 1 - erf(x)
erfc(double x)285 double Faddeeva::erfc(double x)
286 {
287   if (x*x > 750) // underflow
288     return (x >= 0 ? 0.0 : 2.0);
289   return x >= 0 ? exp(-x*x) * Faddeeva::erfcx(x)
290     : 2. - exp(-x*x) * Faddeeva::erfcx(-x);
291 }
292 
293 // erfc(z) = 1 - erf(z)
erfc(complex<double> z,double relerr)294 complex<double> Faddeeva::erfc(complex<double> z, double relerr)
295 {
296   double x = real(z), y = imag(z);
297 
298   if (x == 0.)
299     return complex<double>(1,
300 			   /* handle y -> Inf limit manually, since
301 			      exp(y^2) -> Inf but Im[w(y)] -> 0, so
302 			      IEEE will give us a NaN when it should be Inf */
303 			   y*y > 720 ? (y > 0 ? -Inf : Inf)
304 			   : -exp(y*y) * Faddeeva::w_im(y));
305   if (y == 0.) {
306     if (x*x > 750) // underflow
307       return (x >= 0 ? 0.0 : 2.0);
308     return x >= 0 ? exp(-x*x) * Faddeeva::erfcx(x)
309       : 2. - exp(-x*x) * Faddeeva::erfcx(-x);
310   }
311 
312   double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
313   double mIm_z2 = -2*x*y; // Im(-z^2)
314   if (mRe_z2 < -750) // underflow
315     return (x >= 0 ? 0.0 : 2.0);
316 
317   if (x >= 0)
318     return exp(complex<double>(mRe_z2, mIm_z2))
319       * Faddeeva::w(complex<double>(-y,x), relerr);
320   else
321     return 2.0 - exp(complex<double>(mRe_z2, mIm_z2))
322       * Faddeeva::w(complex<double>(y,-x), relerr);
323 }
324 
325 // compute Dawson(x) = sqrt(pi)/2  *  exp(-x^2) * erfi(x)
Dawson(double x)326 double Faddeeva::Dawson(double x)
327 {
328   const double spi2 = 0.8862269254527580136490837416705725913990; // sqrt(pi)/2
329   return spi2 * Faddeeva::w_im(x);
330 }
331 
332 // compute Dawson(z) = sqrt(pi)/2  *  exp(-z^2) * erfi(z)
Dawson(complex<double> z,double relerr)333 complex<double> Faddeeva::Dawson(complex<double> z, double relerr)
334 {
335   const double spi2 = 0.8862269254527580136490837416705725913990; // sqrt(pi)/2
336   double x = real(z), y = imag(z);
337 
338   // handle axes separately for speed & proper handling of x or y = Inf or NaN
339   if (y == 0)
340     return complex<double>(spi2 * Faddeeva::w_im(x),
341 			   -y); // preserve sign of 0
342   if (x == 0) {
343     double y2 = y*y;
344     if (y2 < 2.5e-5) { // Taylor expansion
345       return complex<double>(x, // preserve sign of 0
346 	 y * (1.
347 	      + y2 * (0.6666666666666666666666666666666666666667
348 		      + y2 * 0.2666666666666666666666666666666666666667)));
349     }
350     return complex<double>(x, // preserve sign of 0
351 			   spi2 * (y >= 0
352 				   ? exp(y2) - Faddeeva::erfcx(y)
353 				   : Faddeeva::erfcx(-y) - exp(y2)));
354   }
355 
356   double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
357   double mIm_z2 = -2*x*y; // Im(-z^2)
358   complex<double> mz2(mRe_z2, mIm_z2); // -z^2
359 
360   /* Handle positive and negative x via different formulas,
361      using the mirror symmetries of w, to avoid overflow/underflow
362      problems from multiplying exponentially large and small quantities. */
363   if (y >= 0) {
364     if (y < 5e-3) {
365       if (fabs(x) < 5e-3)
366 	goto taylor;
367       else if (fabs(mIm_z2) < 5e-3)
368 	goto taylor_realaxis;
369     }
370     complex<double> res = exp(mz2) - Faddeeva::w(z);
371     return spi2 * complex<double>(-imag(res), real(res));
372   }
373   else { // y < 0
374     if (y > -5e-3) { // duplicate from above to avoid fabs(x) call
375       if (fabs(x) < 5e-3)
376 	goto taylor;
377       else if (fabs(mIm_z2) < 5e-3)
378 	goto taylor_realaxis;
379     }
380     else if (my_isnan(y))
381       return complex<double>(x == 0 ? 0 : NaN, NaN);
382     complex<double> res = Faddeeva::w(-z) - exp(mz2);
383     return spi2 * complex<double>(-imag(res), real(res));
384   }
385 
386   // Use Taylor series for small |z|, to avoid cancellation inaccuracy
387   //     dawson(z) = z - 2/3 z^3 + 4/15 z^5 + ...
388  taylor:
389   return z * (1.
390 	      + mz2 * (0.6666666666666666666666666666666666666667
391 		       + mz2 * 0.2666666666666666666666666666666666666667));
392 
393   /* for small |y| and small |xy|,
394      use Taylor series to avoid cancellation inaccuracy:
395        dawson(x + iy)
396         = D + y^2 (D + x - 2Dx^2)
397             + y^4 (D/2 + 5x/6 - 2Dx^2 - x^3/3 + 2Dx^4/3)
398         + iy [ (1-2Dx) + 2/3 y^2 (1 - 3Dx - x^2 + 2Dx^3)
399               + y^4/15 (4 - 15Dx - 9x^2 + 20Dx^3 + 2x^4 - 4Dx^5) ] + ...
400      where D = dawson(x)
401 
402      However, for large |x|, 2Dx -> 1 which gives cancellation problems in
403      this series (many of the leading terms cancel).  So, for large |x|,
404      we need to substitute a continued-fraction expansion for D.
405 
406         dawson(x) = 0.5 / (x-0.5/(x-1/(x-1.5/(x-2/(x-2.5/(x...))))))
407 
408      The 6 terms shown here seems to be the minimum needed to be
409      accurate as soon as the simpler Taylor expansion above starts
410      breaking down.  Using this 6-term expansion, factoring out the
411      denominator, and simplifying with Maple, we obtain:
412 
413       Re dawson(x + iy) * (-15 + 90x^2 - 60x^4 + 8x^6) / x
414         = 33 - 28x^2 + 4x^4 + y^2 (18 - 4x^2) + 4 y^4
415       Im dawson(x + iy) * (-15 + 90x^2 - 60x^4 + 8x^6) / y
416         = -15 + 24x^2 - 4x^4 + 2/3 y^2 (6x^2 - 15) - 4 y^4
417 
418      Finally, for |x| > 5e7, we can use a simpler 1-term continued-fraction
419      expansion for the real part, and a 2-term expansion for the imaginary
420      part.  (This avoids overflow problems for huge |x|.)  This yields:
421 
422      Re dawson(x + iy) = [1 + y^2 (1 + y^2/2 - (xy)^2/3)] / (2x)
423      Im dawson(x + iy) = y [ -1 - 2/3 y^2 + y^4/15 (2x^2 - 4) ] / (2x^2 - 1)
424 
425  */
426  taylor_realaxis:
427   {
428     double x2 = x*x;
429     if (x2 > 1600) { // |x| > 40
430       double y2 = y*y;
431       if (x2 > 25e14) {// |x| > 5e7
432 	double xy2 = (x*y)*(x*y);
433 	return complex<double>((0.5 + y2 * (0.5 + 0.25*y2
434 					    - 0.16666666666666666667*xy2)) / x,
435 			       y * (-1 + y2 * (-0.66666666666666666667
436 					       + 0.13333333333333333333*xy2
437 					       - 0.26666666666666666667*y2))
438 			       / (2*x2 - 1));
439       }
440       return (1. / (-15 + x2*(90 + x2*(-60 + 8*x2)))) *
441 	complex<double>(x * (33 + x2 * (-28 + 4*x2)
442 			     + y2 * (18 - 4*x2 + 4*y2)),
443 			y * (-15 + x2 * (24 - 4*x2)
444 			     + y2 * (4*x2 - 10 - 4*y2)));
445     }
446     else {
447       double D = spi2 * Faddeeva::w_im(x);
448       double x2 = x*x, y2 = y*y;
449       return complex<double>
450 	(D + y2 * (D + x - 2*D*x2)
451 	 + y2*y2 * (D * (0.5 - x2 * (2 - 0.66666666666666666667*x2))
452 		    + x * (0.83333333333333333333
453 			   - 0.33333333333333333333 * x2)),
454 	 y * (1 - 2*D*x
455 	      + y2 * 0.66666666666666666667 * (1 - x2 - D*x * (3 - 2*x2))
456 	      + y2*y2 * (0.26666666666666666667 -
457 			 x2 * (0.6 - 0.13333333333333333333 * x2)
458 			 - D*x * (1 - x2 * (1.3333333333333333333
459 					    - 0.26666666666666666667 * x2)))));
460     }
461   }
462 }
463 
464 /////////////////////////////////////////////////////////////////////////
465 
466 // return sinc(x) = sin(x)/x, given both x and sin(x)
467 // [since we only use this in cases where sin(x) has already been computed]
sinc(double x,double sinx)468 static inline double sinc(double x, double sinx) {
469   return fabs(x) < 1e-4 ? 1 - (0.1666666666666666666667)*x*x : sinx / x;
470 }
471 
472 // sinh(x) via Taylor series, accurate to machine precision for |x| < 1e-2
sinh_taylor(double x)473 static inline double sinh_taylor(double x) {
474   return x * (1 + (x*x) * (0.1666666666666666666667
475 			   + 0.00833333333333333333333 * (x*x)));
476 }
477 
sqr(double x)478 static inline double sqr(double x) { return x*x; }
479 
480 // precomputed table of expa2n2[n-1] = exp(-a2*n*n)
481 // for double-precision a2 = 0.26865... in Faddeeva::w, below.
482 static const double expa2n2[] = {
483   7.64405281671221563e-01,
484   3.41424527166548425e-01,
485   8.91072646929412548e-02,
486   1.35887299055460086e-02,
487   1.21085455253437481e-03,
488   6.30452613933449404e-05,
489   1.91805156577114683e-06,
490   3.40969447714832381e-08,
491   3.54175089099469393e-10,
492   2.14965079583260682e-12,
493   7.62368911833724354e-15,
494   1.57982797110681093e-17,
495   1.91294189103582677e-20,
496   1.35344656764205340e-23,
497   5.59535712428588720e-27,
498   1.35164257972401769e-30,
499   1.90784582843501167e-34,
500   1.57351920291442930e-38,
501   7.58312432328032845e-43,
502   2.13536275438697082e-47,
503   3.51352063787195769e-52,
504   3.37800830266396920e-57,
505   1.89769439468301000e-62,
506   6.22929926072668851e-68,
507   1.19481172006938722e-73,
508   1.33908181133005953e-79,
509   8.76924303483223939e-86,
510   3.35555576166254986e-92,
511   7.50264110688173024e-99,
512   9.80192200745410268e-106,
513   7.48265412822268959e-113,
514   3.33770122566809425e-120,
515   8.69934598159861140e-128,
516   1.32486951484088852e-135,
517   1.17898144201315253e-143,
518   6.13039120236180012e-152,
519   1.86258785950822098e-160,
520   3.30668408201432783e-169,
521   3.43017280887946235e-178,
522   2.07915397775808219e-187,
523   7.36384545323984966e-197,
524   1.52394760394085741e-206,
525   1.84281935046532100e-216,
526   1.30209553802992923e-226,
527   5.37588903521080531e-237,
528   1.29689584599763145e-247,
529   1.82813078022866562e-258,
530   1.50576355348684241e-269,
531   7.24692320799294194e-281,
532   2.03797051314726829e-292,
533   3.34880215927873807e-304,
534   0.0 // underflow (also prevents reads past array end, below)
535 };
536 
537 /////////////////////////////////////////////////////////////////////////
538 
w(complex<double> z,double relerr)539 complex<double> Faddeeva::w(complex<double> z, double relerr)
540 {
541   if (real(z) == 0.0)
542     return complex<double>(Faddeeva::erfcx(imag(z)),
543 			   real(z)); // give correct sign of 0 in imag(w)
544   else if (imag(z) == 0)
545     return complex<double>(exp(-sqr(real(z))),
546 			   Faddeeva::w_im(real(z)));
547 
548   double a, a2, c;
549   if (relerr <= DBL_EPSILON) {
550     relerr = DBL_EPSILON;
551     a = 0.518321480430085929872; // pi / sqrt(-log(eps*0.5))
552     c = 0.329973702884629072537; // (2/pi) * a;
553     a2 = 0.268657157075235951582; // a^2
554   }
555   else {
556     const double pi = 3.14159265358979323846264338327950288419716939937510582;
557     if (relerr > 0.1) relerr = 0.1; // not sensible to compute < 1 digit
558     a = pi / sqrt(-log(relerr*0.5));
559     c = (2/pi)*a;
560     a2 = a*a;
561   }
562   const double x = fabs(real(z));
563   const double y = imag(z), ya = fabs(y);
564 
565   complex<double> ret(0.,0.); // return value
566 
567   double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0;
568 
569 #define USE_CONTINUED_FRACTION 1 // 1 to use continued fraction for large |z|
570 
571 #if USE_CONTINUED_FRACTION
572   if (ya > 7 || (x > 6  // continued fraction is faster
573 		 /* As pointed out by M. Zaghloul, the continued
574 		    fraction seems to give a large relative error in
575 		    Re w(z) for |x| ~ 6 and small |y|, so use
576 		    algorithm 816 in this region: */
577 		 && (ya > 0.1 || (x > 8 && ya > 1e-10) || x > 28))) {
578 
579     /* Poppe & Wijers suggest using a number of terms
580            nu = 3 + 1442 / (26*rho + 77)
581        where rho = sqrt((x/x0)^2 + (y/y0)^2) where x0=6.3, y0=4.4.
582        (They only use this expansion for rho >= 1, but rho a little less
583         than 1 seems okay too.)
584        Instead, I did my own fit to a slightly different function
585        that avoids the hypotenuse calculation, using NLopt to minimize
586        the sum of the squares of the errors in nu with the constraint
587        that the estimated nu be >= minimum nu to attain machine precision.
588        I also separate the regions where nu == 2 and nu == 1. */
589     const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
590     double xs = y < 0 ? -real(z) : real(z); // compute for -z if y < 0
591     if (x + ya > 4000) { // nu <= 2
592       if (x + ya > 1e7) { // nu == 1, w(z) = i/sqrt(pi) / z
593 	// scale to avoid overflow
594 	if (x > ya) {
595 	  double yax = ya / xs;
596 	  double denom = ispi / (xs + yax*ya);
597 	  ret = complex<double>(denom*yax, denom);
598 	}
599 	else if (my_isinf(ya))
600 	  return ((my_isnan(x) || y < 0)
601 		  ? complex<double>(NaN,NaN) : complex<double>(0,0));
602 	else {
603 	  double xya = xs / ya;
604 	  double denom = ispi / (xya*xs + ya);
605 	  ret = complex<double>(denom, denom*xya);
606 	}
607       }
608       else { // nu == 2, w(z) = i/sqrt(pi) * z / (z*z - 0.5)
609 	double dr = xs*xs - ya*ya - 0.5, di = 2*xs*ya;
610 	double denom = ispi / (dr*dr + di*di);
611 	ret = complex<double>(denom * (xs*di-ya*dr), denom * (xs*dr+ya*di));
612       }
613     }
614     else { // compute nu(z) estimate and do general continued fraction
615       const double c0=3.9, c1=11.398, c2=0.08254, c3=0.1421, c4=0.2023; // fit
616       double nu = floor(c0 + c1 / (c2*x + c3*ya + c4));
617       double wr = xs, wi = ya;
618       for (nu = 0.5 * (nu - 1); nu > 0.4; nu -= 0.5) {
619 	// w <- z - nu/w:
620 	double denom = nu / (wr*wr + wi*wi);
621 	wr = xs - wr * denom;
622 	wi = ya + wi * denom;
623       }
624       { // w(z) = i/sqrt(pi) / w:
625 	double denom = ispi / (wr*wr + wi*wi);
626 	ret = complex<double>(denom*wi, denom*wr);
627       }
628     }
629     if (y < 0) {
630       // use w(z) = 2.0*exp(-z*z) - w(-z),
631       // but be careful of overflow in exp(-z*z)
632       //                                = exp(-(xs*xs-ya*ya) -2*i*xs*ya)
633       return 2.0*exp(complex<double>((ya-xs)*(xs+ya), 2*xs*y)) - ret;
634     }
635     else
636       return ret;
637   }
638 #else // !USE_CONTINUED_FRACTION
639   if (x + ya > 1e7) { // w(z) = i/sqrt(pi) / z, to machine precision
640     const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
641     double xs = y < 0 ? -real(z) : real(z); // compute for -z if y < 0
642     // scale to avoid overflow
643     if (x > ya) {
644       double yax = ya / xs;
645       double denom = ispi / (xs + yax*ya);
646       ret = complex<double>(denom*yax, denom);
647     }
648     else {
649       double xya = xs / ya;
650       double denom = ispi / (xya*xs + ya);
651       ret = complex<double>(denom, denom*xya);
652     }
653     if (y < 0) {
654       // use w(z) = 2.0*exp(-z*z) - w(-z),
655       // but be careful of overflow in exp(-z*z)
656       //                                = exp(-(xs*xs-ya*ya) -2*i*xs*ya)
657       return 2.0*exp(complex<double>((ya-xs)*(xs+ya), 2*xs*y)) - ret;
658     }
659     else
660       return ret;
661   }
662 #endif // !USE_CONTINUED_FRACTION
663 
664   /* Note: The test that seems to be suggested in the paper is x <
665      sqrt(-log(DBL_MIN)), about 26.6, since otherwise exp(-x^2)
666      underflows to zero and sum1,sum2,sum4 are zero.  However, long
667      before this occurs, the sum1,sum2,sum4 contributions are
668      negligible in double precision; I find that this happens for x >
669      about 6, for all y.  On the other hand, I find that the case
670      where we compute all of the sums is faster (at least with the
671      precomputed expa2n2 table) until about x=10.  Furthermore, if we
672      try to compute all of the sums for x > 20, I find that we
673      sometimes run into numerical problems because underflow/overflow
674      problems start to appear in the various coefficients of the sums,
675      below.  Therefore, we use x < 10 here. */
676   else if (x < 10) {
677     double prod2ax = 1, prodm2ax = 1;
678     double expx2;
679 
680     if (my_isnan(y))
681       return complex<double>(y,y);
682 
683     /* Somewhat ugly copy-and-paste duplication here, but I see significant
684        speedups from using the special-case code with the precomputed
685        exponential, and the x < 5e-4 special case is needed for accuracy. */
686 
687     if (relerr == DBL_EPSILON) { // use precomputed exp(-a2*(n*n)) table
688       if (x < 5e-4) { // compute sum4 and sum5 together as sum5-sum4
689 	const double x2 = x*x;
690 	expx2 = 1 - x2 * (1 - 0.5*x2); // exp(-x*x) via Taylor
691         // compute exp(2*a*x) and exp(-2*a*x) via Taylor, to double precision
692 	const double ax2 = 1.036642960860171859744*x; // 2*a*x
693 	const double exp2ax =
694 	  1 + ax2 * (1 + ax2 * (0.5 + 0.166666666666666666667*ax2));
695 	const double expm2ax =
696 	  1 - ax2 * (1 - ax2 * (0.5 - 0.166666666666666666667*ax2));
697 	for (int n = 1; 1; ++n) {
698 	  const double coef = expa2n2[n-1] * expx2 / (a2*(n*n) + y*y);
699 	  prod2ax *= exp2ax;
700 	  prodm2ax *= expm2ax;
701 	  sum1 += coef;
702 	  sum2 += coef * prodm2ax;
703 	  sum3 += coef * prod2ax;
704 
705 	  // really = sum5 - sum4
706 	  sum5 += coef * (2*a) * n * sinh_taylor((2*a)*n*x);
707 
708 	  // test convergence via sum3
709 	  if (coef * prod2ax < relerr * sum3) break;
710 	}
711       }
712       else { // x > 5e-4, compute sum4 and sum5 separately
713 	expx2 = exp(-x*x);
714 	const double exp2ax = exp((2*a)*x), expm2ax = 1 / exp2ax;
715 	for (int n = 1; 1; ++n) {
716 	  const double coef = expa2n2[n-1] * expx2 / (a2*(n*n) + y*y);
717 	  prod2ax *= exp2ax;
718 	  prodm2ax *= expm2ax;
719 	  sum1 += coef;
720 	  sum2 += coef * prodm2ax;
721 	  sum4 += (coef * prodm2ax) * (a*n);
722 	  sum3 += coef * prod2ax;
723 	  sum5 += (coef * prod2ax) * (a*n);
724 	  // test convergence via sum5, since this sum has the slowest decay
725 	  if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
726 	}
727       }
728     }
729     else { // relerr != DBL_EPSILON, compute exp(-a2*(n*n)) on the fly
730       const double exp2ax = exp((2*a)*x), expm2ax = 1 / exp2ax;
731       if (x < 5e-4) { // compute sum4 and sum5 together as sum5-sum4
732 	const double x2 = x*x;
733 	expx2 = 1 - x2 * (1 - 0.5*x2); // exp(-x*x) via Taylor
734 	for (int n = 1; 1; ++n) {
735 	  const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
736 	  prod2ax *= exp2ax;
737 	  prodm2ax *= expm2ax;
738 	  sum1 += coef;
739 	  sum2 += coef * prodm2ax;
740 	  sum3 += coef * prod2ax;
741 
742 	  // really = sum5 - sum4
743 	  sum5 += coef * (2*a) * n * sinh_taylor((2*a)*n*x);
744 
745 	  // test convergence via sum3
746 	  if (coef * prod2ax < relerr * sum3) break;
747 	}
748       }
749       else { // x > 5e-4, compute sum4 and sum5 separately
750 	expx2 = exp(-x*x);
751 	for (int n = 1; 1; ++n) {
752 	  const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
753 	  prod2ax *= exp2ax;
754 	  prodm2ax *= expm2ax;
755 	  sum1 += coef;
756 	  sum2 += coef * prodm2ax;
757 	  sum4 += (coef * prodm2ax) * (a*n);
758 	  sum3 += coef * prod2ax;
759 	  sum5 += (coef * prod2ax) * (a*n);
760 	  // test convergence via sum5, since this sum has the slowest decay
761 	  if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
762 	}
763       }
764     }
765     const double expx2erfcxy = // avoid spurious overflow for large negative y
766       y > -6 // for y < -6, erfcx(y) = 2*exp(y*y) to double precision
767       ? expx2*Faddeeva::erfcx(y) : 2*exp(y*y-x*x);
768     if (y > 5) { // imaginary terms cancel
769       const double sinxy = sin(x*y);
770       ret = (expx2erfcxy - c*y*sum1) * cos(2*x*y)
771 	+ (c*x*expx2) * sinxy * sinc(x*y, sinxy);
772     }
773     else {
774       double xs = real(z);
775       const double sinxy = sin(xs*y);
776       const double sin2xy = sin(2*xs*y), cos2xy = cos(2*xs*y);
777       const double coef1 = expx2erfcxy - c*y*sum1;
778       const double coef2 = c*xs*expx2;
779       ret = complex<double>(coef1 * cos2xy + coef2 * sinxy * sinc(xs*y, sinxy),
780 			    coef2 * sinc(2*xs*y, sin2xy) - coef1 * sin2xy);
781     }
782   }
783   else { // x large: only sum3 & sum5 contribute (see above note)
784     if (my_isnan(x))
785       return complex<double>(x,x);
786     if (my_isnan(y))
787       return complex<double>(y,y);
788 
789 #if USE_CONTINUED_FRACTION
790     ret = exp(-x*x); // |y| < 1e-10, so we only need exp(-x*x) term
791 #else
792     if (y < 0) {
793       /* erfcx(y) ~ 2*exp(y*y) + (< 1) if y < 0, so
794 	 erfcx(y)*exp(-x*x) ~ 2*exp(y*y-x*x) term may not be negligible
795 	 if y*y - x*x > -36 or so.  So, compute this term just in case.
796 	 We also need the -exp(-x*x) term to compute Re[w] accurately
797 	 in the case where y is very small. */
798       ret = polar(2*exp(y*y-x*x) - exp(-x*x), -2*real(z)*y);
799     }
800     else
801       ret = exp(-x*x); // not negligible in real part if y very small
802 #endif
803     // (round instead of ceil as in original paper; note that x/a > 1 here)
804     double n0 = floor(x/a + 0.5); // sum in both directions, starting at n0
805     double dx = a*n0 - x;
806     sum3 = exp(-dx*dx) / (a2*(n0*n0) + y*y);
807     sum5 = a*n0 * sum3;
808     double exp1 = exp(4*a*dx), exp1dn = 1;
809     int dn;
810     for (dn = 1; n0 - dn > 0; ++dn) { // loop over n0-dn and n0+dn terms
811       double np = n0 + dn, nm = n0 - dn;
812       double tp = exp(-sqr(a*dn+dx));
813       double tm = tp * (exp1dn *= exp1); // trick to get tm from tp
814       tp /= (a2*(np*np) + y*y);
815       tm /= (a2*(nm*nm) + y*y);
816       sum3 += tp + tm;
817       sum5 += a * (np * tp + nm * tm);
818       if (a * (np * tp + nm * tm) < relerr * sum5) goto finish;
819     }
820     while (1) { // loop over n0+dn terms only (since n0-dn <= 0)
821       double np = n0 + dn++;
822       double tp = exp(-sqr(a*dn+dx)) / (a2*(np*np) + y*y);
823       sum3 += tp;
824       sum5 += a * np * tp;
825       if (a * np * tp < relerr * sum5) goto finish;
826     }
827   }
828  finish:
829   return ret + complex<double>((0.5*c)*y*(sum2+sum3),
830 			       (0.5*c)*my_copysign(sum5-sum4, real(z)));
831 }
832 
833 /////////////////////////////////////////////////////////////////////////
834 
835 /* erfcx(x) = exp(x^2) erfc(x) function, for real x, written by
836    Steven G. Johnson, October 2012.
837 
838    This function combines a few different ideas.
839 
840    First, for x > 50, it uses a continued-fraction expansion (same as
841    for the Faddeeva function, but with algebraic simplifications for z=i*x).
842 
843    Second, for 0 <= x <= 50, it uses Chebyshev polynomial approximations,
844    but with two twists:
845 
846       a) It maps x to y = 4 / (4+x) in [0,1].  This simple transformation,
847          inspired by a similar transformation in the octave-forge/specfun
848 	 erfcx by Soren Hauberg, results in much faster Chebyshev convergence
849 	 than other simple transformations I have examined.
850 
851       b) Instead of using a single Chebyshev polynomial for the entire
852          [0,1] y interval, we break the interval up into 100 equal
853 	 subintervals, with a switch/lookup table, and use much lower
854 	 degree Chebyshev polynomials in each subinterval. This greatly
855 	 improves performance in my tests.
856 
857    For x < 0, we use the relationship erfcx(-x) = 2 exp(x^2) - erfc(x),
858    with the usual checks for overflow etcetera.
859 
860    Performance-wise, it seems to be substantially faster than either
861    the SLATEC DERFC function [or an erfcx function derived therefrom]
862    or Cody's CALERF function (from netlib.org/specfun), while
863    retaining near machine precision in accuracy.  */
864 
865 /* Given y100=100*y, where y = 4/(4+x) for x >= 0, compute erfc(x).
866 
867    Uses a look-up table of 100 different Chebyshev polynomials
868    for y intervals [0,0.01], [0.01,0.02], ...., [0.99,1], generated
869    with the help of Maple and a little shell script.   This allows
870    the Chebyshev polynomials to be of significantly lower degree (about 1/4)
871    compared to fitting the whole [0,1] interval with a single polynomial. */
erfcx_y100(double y100)872 static double erfcx_y100(double y100)
873 {
874   switch ((int) y100) {
875 case 0: {
876 double t = 2*y100 - 1;
877 return 0.70878032454106438663e-3 + (0.71234091047026302958e-3 + (0.35779077297597742384e-5 + (0.17403143962587937815e-7 + (0.81710660047307788845e-10 + (0.36885022360434957634e-12 + 0.15917038551111111111e-14 * t) * t) * t) * t) * t) * t;
878 }
879 case 1: {
880 double t = 2*y100 - 3;
881 return 0.21479143208285144230e-2 + (0.72686402367379996033e-3 + (0.36843175430938995552e-5 + (0.18071841272149201685e-7 + (0.85496449296040325555e-10 + (0.38852037518534291510e-12 + 0.16868473576888888889e-14 * t) * t) * t) * t) * t) * t;
882 }
883 case 2: {
884 double t = 2*y100 - 5;
885 return 0.36165255935630175090e-2 + (0.74182092323555510862e-3 + (0.37948319957528242260e-5 + (0.18771627021793087350e-7 + (0.89484715122415089123e-10 + (0.40935858517772440862e-12 + 0.17872061464888888889e-14 * t) * t) * t) * t) * t) * t;
886 }
887 case 3: {
888 double t = 2*y100 - 7;
889 return 0.51154983860031979264e-2 + (0.75722840734791660540e-3 + (0.39096425726735703941e-5 + (0.19504168704300468210e-7 + (0.93687503063178993915e-10 + (0.43143925959079664747e-12 + 0.18939926435555555556e-14 * t) * t) * t) * t) * t) * t;
890 }
891 case 4: {
892 double t = 2*y100 - 9;
893 return 0.66457513172673049824e-2 + (0.77310406054447454920e-3 + (0.40289510589399439385e-5 + (0.20271233238288381092e-7 + (0.98117631321709100264e-10 + (0.45484207406017752971e-12 + 0.20076352213333333333e-14 * t) * t) * t) * t) * t) * t;
894 }
895 case 5: {
896 double t = 2*y100 - 11;
897 return 0.82082389970241207883e-2 + (0.78946629611881710721e-3 + (0.41529701552622656574e-5 + (0.21074693344544655714e-7 + (0.10278874108587317989e-9 + (0.47965201390613339638e-12 + 0.21285907413333333333e-14 * t) * t) * t) * t) * t) * t;
898 }
899 case 6: {
900 double t = 2*y100 - 13;
901 return 0.98039537275352193165e-2 + (0.80633440108342840956e-3 + (0.42819241329736982942e-5 + (0.21916534346907168612e-7 + (0.10771535136565470914e-9 + (0.50595972623692822410e-12 + 0.22573462684444444444e-14 * t) * t) * t) * t) * t) * t;
902 }
903 case 7: {
904 double t = 2*y100 - 15;
905 return 0.11433927298290302370e-1 + (0.82372858383196561209e-3 + (0.44160495311765438816e-5 + (0.22798861426211986056e-7 + (0.11291291745879239736e-9 + (0.53386189365816880454e-12 + 0.23944209546666666667e-14 * t) * t) * t) * t) * t) * t;
906 }
907 case 8: {
908 double t = 2*y100 - 17;
909 return 0.13099232878814653979e-1 + (0.84167002467906968214e-3 + (0.45555958988457506002e-5 + (0.23723907357214175198e-7 + (0.11839789326602695603e-9 + (0.56346163067550237877e-12 + 0.25403679644444444444e-14 * t) * t) * t) * t) * t) * t;
910 }
911 case 9: {
912 double t = 2*y100 - 19;
913 return 0.14800987015587535621e-1 + (0.86018092946345943214e-3 + (0.47008265848816866105e-5 + (0.24694040760197315333e-7 + (0.12418779768752299093e-9 + (0.59486890370320261949e-12 + 0.26957764568888888889e-14 * t) * t) * t) * t) * t) * t;
914 }
915 case 10: {
916 double t = 2*y100 - 21;
917 return 0.16540351739394069380e-1 + (0.87928458641241463952e-3 + (0.48520195793001753903e-5 + (0.25711774900881709176e-7 + (0.13030128534230822419e-9 + (0.62820097586874779402e-12 + 0.28612737351111111111e-14 * t) * t) * t) * t) * t) * t;
918 }
919 case 11: {
920 double t = 2*y100 - 23;
921 return 0.18318536789842392647e-1 + (0.89900542647891721692e-3 + (0.50094684089553365810e-5 + (0.26779777074218070482e-7 + (0.13675822186304615566e-9 + (0.66358287745352705725e-12 + 0.30375273884444444444e-14 * t) * t) * t) * t) * t) * t;
922 }
923 case 12: {
924 double t = 2*y100 - 25;
925 return 0.20136801964214276775e-1 + (0.91936908737673676012e-3 + (0.51734830914104276820e-5 + (0.27900878609710432673e-7 + (0.14357976402809042257e-9 + (0.70114790311043728387e-12 + 0.32252476000000000000e-14 * t) * t) * t) * t) * t) * t;
926 }
927 case 13: {
928 double t = 2*y100 - 27;
929 return 0.21996459598282740954e-1 + (0.94040248155366777784e-3 + (0.53443911508041164739e-5 + (0.29078085538049374673e-7 + (0.15078844500329731137e-9 + (0.74103813647499204269e-12 + 0.34251892320000000000e-14 * t) * t) * t) * t) * t) * t;
930 }
931 case 14: {
932 double t = 2*y100 - 29;
933 return 0.23898877187226319502e-1 + (0.96213386835900177540e-3 + (0.55225386998049012752e-5 + (0.30314589961047687059e-7 + (0.15840826497296335264e-9 + (0.78340500472414454395e-12 + 0.36381553564444444445e-14 * t) * t) * t) * t) * t) * t;
934 }
935 case 15: {
936 double t = 2*y100 - 31;
937 return 0.25845480155298518485e-1 + (0.98459293067820123389e-3 + (0.57082915920051843672e-5 + (0.31613782169164830118e-7 + (0.16646478745529630813e-9 + (0.82840985928785407942e-12 + 0.38649975768888888890e-14 * t) * t) * t) * t) * t) * t;
938 }
939 case 16: {
940 double t = 2*y100 - 33;
941 return 0.27837754783474696598e-1 + (0.10078108563256892757e-2 + (0.59020366493792212221e-5 + (0.32979263553246520417e-7 + (0.17498524159268458073e-9 + (0.87622459124842525110e-12 + 0.41066206488888888890e-14 * t) * t) * t) * t) * t) * t;
942 }
943 case 17: {
944 double t = 2*y100 - 35;
945 return 0.29877251304899307550e-1 + (0.10318204245057349310e-2 + (0.61041829697162055093e-5 + (0.34414860359542720579e-7 + (0.18399863072934089607e-9 + (0.92703227366365046533e-12 + 0.43639844053333333334e-14 * t) * t) * t) * t) * t) * t;
946 }
947 case 18: {
948 double t = 2*y100 - 37;
949 return 0.31965587178596443475e-1 + (0.10566560976716574401e-2 + (0.63151633192414586770e-5 + (0.35924638339521924242e-7 + (0.19353584758781174038e-9 + (0.98102783859889264382e-12 + 0.46381060817777777779e-14 * t) * t) * t) * t) * t) * t;
950 }
951 case 19: {
952 double t = 2*y100 - 39;
953 return 0.34104450552588334840e-1 + (0.10823541191350532574e-2 + (0.65354356159553934436e-5 + (0.37512918348533521149e-7 + (0.20362979635817883229e-9 + (0.10384187833037282363e-11 + 0.49300625262222222221e-14 * t) * t) * t) * t) * t) * t;
954 }
955 case 20: {
956 double t = 2*y100 - 41;
957 return 0.36295603928292425716e-1 + (0.11089526167995268200e-2 + (0.67654845095518363577e-5 + (0.39184292949913591646e-7 + (0.21431552202133775150e-9 + (0.10994259106646731797e-11 + 0.52409949102222222221e-14 * t) * t) * t) * t) * t) * t;
958 }
959 case 21: {
960 double t = 2*y100 - 43;
961 return 0.38540888038840509795e-1 + (0.11364917134175420009e-2 + (0.70058230641246312003e-5 + (0.40943644083718586939e-7 + (0.22563034723692881631e-9 + (0.11642841011361992885e-11 + 0.55721092871111111110e-14 * t) * t) * t) * t) * t) * t;
962 }
963 case 22: {
964 double t = 2*y100 - 45;
965 return 0.40842225954785960651e-1 + (0.11650136437945673891e-2 + (0.72569945502343006619e-5 + (0.42796161861855042273e-7 + (0.23761401711005024162e-9 + (0.12332431172381557035e-11 + 0.59246802364444444445e-14 * t) * t) * t) * t) * t) * t;
966 }
967 case 23: {
968 double t = 2*y100 - 47;
969 return 0.43201627431540222422e-1 + (0.11945628793917272199e-2 + (0.75195743532849206263e-5 + (0.44747364553960993492e-7 + (0.25030885216472953674e-9 + (0.13065684400300476484e-11 + 0.63000532853333333334e-14 * t) * t) * t) * t) * t) * t;
970 }
971 case 24: {
972 double t = 2*y100 - 49;
973 return 0.45621193513810471438e-1 + (0.12251862608067529503e-2 + (0.77941720055551920319e-5 + (0.46803119830954460212e-7 + (0.26375990983978426273e-9 + (0.13845421370977119765e-11 + 0.66996477404444444445e-14 * t) * t) * t) * t) * t) * t;
974 }
975 case 25: {
976 double t = 2*y100 - 51;
977 return 0.48103121413299865517e-1 + (0.12569331386432195113e-2 + (0.80814333496367673980e-5 + (0.48969667335682018324e-7 + (0.27801515481905748484e-9 + (0.14674637611609884208e-11 + 0.71249589351111111110e-14 * t) * t) * t) * t) * t) * t;
978 }
979 case 26: {
980 double t = 2*y100 - 53;
981 return 0.50649709676983338501e-1 + (0.12898555233099055810e-2 + (0.83820428414568799654e-5 + (0.51253642652551838659e-7 + (0.29312563849675507232e-9 + (0.15556512782814827846e-11 + 0.75775607822222222221e-14 * t) * t) * t) * t) * t) * t;
982 }
983 case 27: {
984 double t = 2*y100 - 55;
985 return 0.53263363664388864181e-1 + (0.13240082443256975769e-2 + (0.86967260015007658418e-5 + (0.53662102750396795566e-7 + (0.30914568786634796807e-9 + (0.16494420240828493176e-11 + 0.80591079644444444445e-14 * t) * t) * t) * t) * t) * t;
986 }
987 case 28: {
988 double t = 2*y100 - 57;
989 return 0.55946601353500013794e-1 + (0.13594491197408190706e-2 + (0.90262520233016380987e-5 + (0.56202552975056695376e-7 + (0.32613310410503135996e-9 + (0.17491936862246367398e-11 + 0.85713381688888888890e-14 * t) * t) * t) * t) * t) * t;
990 }
991 case 29: {
992 double t = 2*y100 - 59;
993 return 0.58702059496154081813e-1 + (0.13962391363223647892e-2 + (0.93714365487312784270e-5 + (0.58882975670265286526e-7 + (0.34414937110591753387e-9 + (0.18552853109751857859e-11 + 0.91160736711111111110e-14 * t) * t) * t) * t) * t) * t;
994 }
995 case 30: {
996 double t = 2*y100 - 61;
997 return 0.61532500145144778048e-1 + (0.14344426411912015247e-2 + (0.97331446201016809696e-5 + (0.61711860507347175097e-7 + (0.36325987418295300221e-9 + (0.19681183310134518232e-11 + 0.96952238400000000000e-14 * t) * t) * t) * t) * t) * t;
998 }
999 case 31: {
1000 double t = 2*y100 - 63;
1001 return 0.64440817576653297993e-1 + (0.14741275456383131151e-2 + (0.10112293819576437838e-4 + (0.64698236605933246196e-7 + (0.38353412915303665586e-9 + (0.20881176114385120186e-11 + 0.10310784480000000000e-13 * t) * t) * t) * t) * t) * t;
1002 }
1003 case 32: {
1004 double t = 2*y100 - 65;
1005 return 0.67430045633130393282e-1 + (0.15153655418916540370e-2 + (0.10509857606888328667e-4 + (0.67851706529363332855e-7 + (0.40504602194811140006e-9 + (0.22157325110542534469e-11 + 0.10964842115555555556e-13 * t) * t) * t) * t) * t) * t;
1006 }
1007 case 33: {
1008 double t = 2*y100 - 67;
1009 return 0.70503365513338850709e-1 + (0.15582323336495709827e-2 + (0.10926868866865231089e-4 + (0.71182482239613507542e-7 + (0.42787405890153386710e-9 + (0.23514379522274416437e-11 + 0.11659571751111111111e-13 * t) * t) * t) * t) * t) * t;
1010 }
1011 case 34: {
1012 double t = 2*y100 - 69;
1013 return 0.73664114037944596353e-1 + (0.16028078812438820413e-2 + (0.11364423678778207991e-4 + (0.74701423097423182009e-7 + (0.45210162777476488324e-9 + (0.24957355004088569134e-11 + 0.12397238257777777778e-13 * t) * t) * t) * t) * t) * t;
1014 }
1015 case 35: {
1016 double t = 2*y100 - 71;
1017 return 0.76915792420819562379e-1 + (0.16491766623447889354e-2 + (0.11823685320041302169e-4 + (0.78420075993781544386e-7 + (0.47781726956916478925e-9 + (0.26491544403815724749e-11 + 0.13180196462222222222e-13 * t) * t) * t) * t) * t) * t;
1018 }
1019 case 36: {
1020 double t = 2*y100 - 73;
1021 return 0.80262075578094612819e-1 + (0.16974279491709504117e-2 + (0.12305888517309891674e-4 + (0.82350717698979042290e-7 + (0.50511496109857113929e-9 + (0.28122528497626897696e-11 + 0.14010889635555555556e-13 * t) * t) * t) * t) * t) * t;
1022 }
1023 case 37: {
1024 double t = 2*y100 - 75;
1025 return 0.83706822008980357446e-1 + (0.17476561032212656962e-2 + (0.12812343958540763368e-4 + (0.86506399515036435592e-7 + (0.53409440823869467453e-9 + (0.29856186620887555043e-11 + 0.14891851591111111111e-13 * t) * t) * t) * t) * t) * t;
1026 }
1027 case 38: {
1028 double t = 2*y100 - 77;
1029 return 0.87254084284461718231e-1 + (0.17999608886001962327e-2 + (0.13344443080089492218e-4 + (0.90900994316429008631e-7 + (0.56486134972616465316e-9 + (0.31698707080033956934e-11 + 0.15825697795555555556e-13 * t) * t) * t) * t) * t) * t;
1030 }
1031 case 39: {
1032 double t = 2*y100 - 79;
1033 return 0.90908120182172748487e-1 + (0.18544478050657699758e-2 + (0.13903663143426120077e-4 + (0.95549246062549906177e-7 + (0.59752787125242054315e-9 + (0.33656597366099099413e-11 + 0.16815130613333333333e-13 * t) * t) * t) * t) * t) * t;
1034 }
1035 case 40: {
1036 double t = 2*y100 - 81;
1037 return 0.94673404508075481121e-1 + (0.19112284419887303347e-2 + (0.14491572616545004930e-4 + (0.10046682186333613697e-6 + (0.63221272959791000515e-9 + (0.35736693975589130818e-11 + 0.17862931591111111111e-13 * t) * t) * t) * t) * t) * t;
1038 }
1039 case 41: {
1040 double t = 2*y100 - 83;
1041 return 0.98554641648004456555e-1 + (0.19704208544725622126e-2 + (0.15109836875625443935e-4 + (0.10567036667675984067e-6 + (0.66904168640019354565e-9 + (0.37946171850824333014e-11 + 0.18971959040000000000e-13 * t) * t) * t) * t) * t) * t;
1042 }
1043 case 42: {
1044 double t = 2*y100 - 85;
1045 return 0.10255677889470089531e0 + (0.20321499629472857418e-2 + (0.15760224242962179564e-4 + (0.11117756071353507391e-6 + (0.70814785110097658502e-9 + (0.40292553276632563925e-11 + 0.20145143075555555556e-13 * t) * t) * t) * t) * t) * t;
1046 }
1047 case 43: {
1048 double t = 2*y100 - 87;
1049 return 0.10668502059865093318e0 + (0.20965479776148731610e-2 + (0.16444612377624983565e-4 + (0.11700717962026152749e-6 + (0.74967203250938418991e-9 + (0.42783716186085922176e-11 + 0.21385479360000000000e-13 * t) * t) * t) * t) * t) * t;
1050 }
1051 case 44: {
1052 double t = 2*y100 - 89;
1053 return 0.11094484319386444474e0 + (0.21637548491908170841e-2 + (0.17164995035719657111e-4 + (0.12317915750735938089e-6 + (0.79376309831499633734e-9 + (0.45427901763106353914e-11 + 0.22696025653333333333e-13 * t) * t) * t) * t) * t) * t;
1054 }
1055 case 45: {
1056 double t = 2*y100 - 91;
1057 return 0.11534201115268804714e0 + (0.22339187474546420375e-2 + (0.17923489217504226813e-4 + (0.12971465288245997681e-6 + (0.84057834180389073587e-9 + (0.48233721206418027227e-11 + 0.24079890062222222222e-13 * t) * t) * t) * t) * t) * t;
1058 }
1059 case 46: {
1060 double t = 2*y100 - 93;
1061 return 0.11988259392684094740e0 + (0.23071965691918689601e-2 + (0.18722342718958935446e-4 + (0.13663611754337957520e-6 + (0.89028385488493287005e-9 + (0.51210161569225846701e-11 + 0.25540227111111111111e-13 * t) * t) * t) * t) * t) * t;
1062 }
1063 case 47: {
1064 double t = 2*y100 - 95;
1065 return 0.12457298393509812907e0 + (0.23837544771809575380e-2 + (0.19563942105711612475e-4 + (0.14396736847739470782e-6 + (0.94305490646459247016e-9 + (0.54366590583134218096e-11 + 0.27080225920000000000e-13 * t) * t) * t) * t) * t) * t;
1066 }
1067 case 48: {
1068 double t = 2*y100 - 97;
1069 return 0.12941991566142438816e0 + (0.24637684719508859484e-2 + (0.20450821127475879816e-4 + (0.15173366280523906622e-6 + (0.99907632506389027739e-9 + (0.57712760311351625221e-11 + 0.28703099555555555556e-13 * t) * t) * t) * t) * t) * t;
1070 }
1071 case 49: {
1072 double t = 2*y100 - 99;
1073 return 0.13443048593088696613e0 + (0.25474249981080823877e-2 + (0.21385669591362915223e-4 + (0.15996177579900443030e-6 + (0.10585428844575134013e-8 + (0.61258809536787882989e-11 + 0.30412080142222222222e-13 * t) * t) * t) * t) * t) * t;
1074 }
1075 case 50: {
1076 double t = 2*y100 - 101;
1077 return 0.13961217543434561353e0 + (0.26349215871051761416e-2 + (0.22371342712572567744e-4 + (0.16868008199296822247e-6 + (0.11216596910444996246e-8 + (0.65015264753090890662e-11 + 0.32210394506666666666e-13 * t) * t) * t) * t) * t) * t;
1078 }
1079 case 51: {
1080 double t = 2*y100 - 103;
1081 return 0.14497287157673800690e0 + (0.27264675383982439814e-2 + (0.23410870961050950197e-4 + (0.17791863939526376477e-6 + (0.11886425714330958106e-8 + (0.68993039665054288034e-11 + 0.34101266222222222221e-13 * t) * t) * t) * t) * t) * t;
1082 }
1083 case 52: {
1084 double t = 2*y100 - 105;
1085 return 0.15052089272774618151e0 + (0.28222846410136238008e-2 + (0.24507470422713397006e-4 + (0.18770927679626136909e-6 + (0.12597184587583370712e-8 + (0.73203433049229821618e-11 + 0.36087889048888888890e-13 * t) * t) * t) * t) * t) * t;
1086 }
1087 case 53: {
1088 double t = 2*y100 - 107;
1089 return 0.15626501395774612325e0 + (0.29226079376196624949e-2 + (0.25664553693768450545e-4 + (0.19808568415654461964e-6 + (0.13351257759815557897e-8 + (0.77658124891046760667e-11 + 0.38173420035555555555e-13 * t) * t) * t) * t) * t) * t;
1090 }
1091 case 54: {
1092 double t = 2*y100 - 109;
1093 return 0.16221449434620737567e0 + (0.30276865332726475672e-2 + (0.26885741326534564336e-4 + (0.20908350604346384143e-6 + (0.14151148144240728728e-8 + (0.82369170665974313027e-11 + 0.40360957457777777779e-13 * t) * t) * t) * t) * t) * t;
1094 }
1095 case 55: {
1096 double t = 2*y100 - 111;
1097 return 0.16837910595412130659e0 + (0.31377844510793082301e-2 + (0.28174873844911175026e-4 + (0.22074043807045782387e-6 + (0.14999481055996090039e-8 + (0.87348993661930809254e-11 + 0.42653528977777777779e-13 * t) * t) * t) * t) * t) * t;
1098 }
1099 case 56: {
1100 double t = 2*y100 - 113;
1101 return 0.17476916455659369953e0 + (0.32531815370903068316e-2 + (0.29536024347344364074e-4 + (0.23309632627767074202e-6 + (0.15899007843582444846e-8 + (0.92610375235427359475e-11 + 0.45054073102222222221e-13 * t) * t) * t) * t) * t) * t;
1102 }
1103 case 57: {
1104 double t = 2*y100 - 115;
1105 return 0.18139556223643701364e0 + (0.33741744168096996041e-2 + (0.30973511714709500836e-4 + (0.24619326937592290996e-6 + (0.16852609412267750744e-8 + (0.98166442942854895573e-11 + 0.47565418097777777779e-13 * t) * t) * t) * t) * t) * t;
1106 }
1107 case 58: {
1108 double t = 2*y100 - 117;
1109 return 0.18826980194443664549e0 + (0.35010775057740317997e-2 + (0.32491914440014267480e-4 + (0.26007572375886319028e-6 + (0.17863299617388376116e-8 + (0.10403065638343878679e-10 + 0.50190265831111111110e-13 * t) * t) * t) * t) * t) * t;
1110 }
1111 case 59: {
1112 double t = 2*y100 - 119;
1113 return 0.19540403413693967350e0 + (0.36342240767211326315e-2 + (0.34096085096200907289e-4 + (0.27479061117017637474e-6 + (0.18934228504790032826e-8 + (0.11021679075323598664e-10 + 0.52931171733333333334e-13 * t) * t) * t) * t) * t) * t;
1114 }
1115 case 60: {
1116 double t = 2*y100 - 121;
1117 return 0.20281109560651886959e0 + (0.37739673859323597060e-2 + (0.35791165457592409054e-4 + (0.29038742889416172404e-6 + (0.20068685374849001770e-8 + (0.11673891799578381999e-10 + 0.55790523093333333334e-13 * t) * t) * t) * t) * t) * t;
1118 }
1119 case 61: {
1120 double t = 2*y100 - 123;
1121 return 0.21050455062669334978e0 + (0.39206818613925652425e-2 + (0.37582602289680101704e-4 + (0.30691836231886877385e-6 + (0.21270101645763677824e-8 + (0.12361138551062899455e-10 + 0.58770520160000000000e-13 * t) * t) * t) * t) * t) * t;
1122 }
1123 case 62: {
1124 double t = 2*y100 - 125;
1125 return 0.21849873453703332479e0 + (0.40747643554689586041e-2 + (0.39476163820986711501e-4 + (0.32443839970139918836e-6 + (0.22542053491518680200e-8 + (0.13084879235290858490e-10 + 0.61873153262222222221e-13 * t) * t) * t) * t) * t) * t;
1126 }
1127 case 63: {
1128 double t = 2*y100 - 127;
1129 return 0.22680879990043229327e0 + (0.42366354648628516935e-2 + (0.41477956909656896779e-4 + (0.34300544894502810002e-6 + (0.23888264229264067658e-8 + (0.13846596292818514601e-10 + 0.65100183751111111110e-13 * t) * t) * t) * t) * t) * t;
1130 }
1131 case 64: {
1132 double t = 2*y100 - 129;
1133 return 0.23545076536988703937e0 + (0.44067409206365170888e-2 + (0.43594444916224700881e-4 + (0.36268045617760415178e-6 + (0.25312606430853202748e-8 + (0.14647791812837903061e-10 + 0.68453122631111111110e-13 * t) * t) * t) * t) * t) * t;
1134 }
1135 case 65: {
1136 double t = 2*y100 - 131;
1137 return 0.24444156740777432838e0 + (0.45855530511605787178e-2 + (0.45832466292683085475e-4 + (0.38352752590033030472e-6 + (0.26819103733055603460e-8 + (0.15489984390884756993e-10 + 0.71933206364444444445e-13 * t) * t) * t) * t) * t) * t;
1138 }
1139 case 66: {
1140 double t = 2*y100 - 133;
1141 return 0.25379911500634264643e0 + (0.47735723208650032167e-2 + (0.48199253896534185372e-4 + (0.40561404245564732314e-6 + (0.28411932320871165585e-8 + (0.16374705736458320149e-10 + 0.75541379822222222221e-13 * t) * t) * t) * t) * t) * t;
1142 }
1143 case 67: {
1144 double t = 2*y100 - 135;
1145 return 0.26354234756393613032e0 + (0.49713289477083781266e-2 + (0.50702455036930367504e-4 + (0.42901079254268185722e-6 + (0.30095422058900481753e-8 + (0.17303497025347342498e-10 + 0.79278273368888888890e-13 * t) * t) * t) * t) * t) * t;
1146 }
1147 case 68: {
1148 double t = 2*y100 - 137;
1149 return 0.27369129607732343398e0 + (0.51793846023052643767e-2 + (0.53350152258326602629e-4 + (0.45379208848865015485e-6 + (0.31874057245814381257e-8 + (0.18277905010245111046e-10 + 0.83144182364444444445e-13 * t) * t) * t) * t) * t) * t;
1150 }
1151 case 69: {
1152 double t = 2*y100 - 139;
1153 return 0.28426714781640316172e0 + (0.53983341916695141966e-2 + (0.56150884865255810638e-4 + (0.48003589196494734238e-6 + (0.33752476967570796349e-8 + (0.19299477888083469086e-10 + 0.87139049137777777779e-13 * t) * t) * t) * t) * t) * t;
1154 }
1155 case 70: {
1156 double t = 2*y100 - 141;
1157 return 0.29529231465348519920e0 + (0.56288077305420795663e-2 + (0.59113671189913307427e-4 + (0.50782393781744840482e-6 + (0.35735475025851713168e-8 + (0.20369760937017070382e-10 + 0.91262442613333333334e-13 * t) * t) * t) * t) * t) * t;
1158 }
1159 case 71: {
1160 double t = 2*y100 - 143;
1161 return 0.30679050522528838613e0 + (0.58714723032745403331e-2 + (0.62248031602197686791e-4 + (0.53724185766200945789e-6 + (0.37827999418960232678e-8 + (0.21490291930444538307e-10 + 0.95513539182222222221e-13 * t) * t) * t) * t) * t) * t;
1162 }
1163 case 72: {
1164 double t = 2*y100 - 145;
1165 return 0.31878680111173319425e0 + (0.61270341192339103514e-2 + (0.65564012259707640976e-4 + (0.56837930287837738996e-6 + (0.40035151353392378882e-8 + (0.22662596341239294792e-10 + 0.99891109760000000000e-13 * t) * t) * t) * t) * t) * t;
1166 }
1167 case 73: {
1168 double t = 2*y100 - 147;
1169 return 0.33130773722152622027e0 + (0.63962406646798080903e-2 + (0.69072209592942396666e-4 + (0.60133006661885941812e-6 + (0.42362183765883466691e-8 + (0.23888182347073698382e-10 + 0.10439349811555555556e-12 * t) * t) * t) * t) * t) * t;
1170 }
1171 case 74: {
1172 double t = 2*y100 - 149;
1173 return 0.34438138658041336523e0 + (0.66798829540414007258e-2 + (0.72783795518603561144e-4 + (0.63619220443228800680e-6 + (0.44814499336514453364e-8 + (0.25168535651285475274e-10 + 0.10901861383111111111e-12 * t) * t) * t) * t) * t) * t;
1174 }
1175 case 75: {
1176 double t = 2*y100 - 151;
1177 return 0.35803744972380175583e0 + (0.69787978834882685031e-2 + (0.76710543371454822497e-4 + (0.67306815308917386747e-6 + (0.47397647975845228205e-8 + (0.26505114141143050509e-10 + 0.11376390933333333333e-12 * t) * t) * t) * t) * t) * t;
1178 }
1179 case 76: {
1180 double t = 2*y100 - 153;
1181 return 0.37230734890119724188e0 + (0.72938706896461381003e-2 + (0.80864854542670714092e-4 + (0.71206484718062688779e-6 + (0.50117323769745883805e-8 + (0.27899342394100074165e-10 + 0.11862637614222222222e-12 * t) * t) * t) * t) * t) * t;
1182 }
1183 case 77: {
1184 double t = 2*y100 - 155;
1185 return 0.38722432730555448223e0 + (0.76260375162549802745e-2 + (0.85259785810004603848e-4 + (0.75329383305171327677e-6 + (0.52979361368388119355e-8 + (0.29352606054164086709e-10 + 0.12360253370666666667e-12 * t) * t) * t) * t) * t) * t;
1186 }
1187 case 78: {
1188 double t = 2*y100 - 157;
1189 return 0.40282355354616940667e0 + (0.79762880915029728079e-2 + (0.89909077342438246452e-4 + (0.79687137961956194579e-6 + (0.55989731807360403195e-8 + (0.30866246101464869050e-10 + 0.12868841946666666667e-12 * t) * t) * t) * t) * t) * t;
1190 }
1191 case 79: {
1192 double t = 2*y100 - 159;
1193 return 0.41914223158913787649e0 + (0.83456685186950463538e-2 + (0.94827181359250161335e-4 + (0.84291858561783141014e-6 + (0.59154537751083485684e-8 + (0.32441553034347469291e-10 + 0.13387957943111111111e-12 * t) * t) * t) * t) * t) * t;
1194 }
1195 case 80: {
1196 double t = 2*y100 - 161;
1197 return 0.43621971639463786896e0 + (0.87352841828289495773e-2 + (0.10002929142066799966e-3 + (0.89156148280219880024e-6 + (0.62480008150788597147e-8 + (0.34079760983458878910e-10 + 0.13917107176888888889e-12 * t) * t) * t) * t) * t) * t;
1198 }
1199 case 81: {
1200 double t = 2*y100 - 163;
1201 return 0.45409763548534330981e0 + (0.91463027755548240654e-2 + (0.10553137232446167258e-3 + (0.94293113464638623798e-6 + (0.65972492312219959885e-8 + (0.35782041795476563662e-10 + 0.14455745872000000000e-12 * t) * t) * t) * t) * t) * t;
1202 }
1203 case 82: {
1204 double t = 2*y100 - 165;
1205 return 0.47282001668512331468e0 + (0.95799574408860463394e-2 + (0.11135019058000067469e-3 + (0.99716373005509038080e-6 + (0.69638453369956970347e-8 + (0.37549499088161345850e-10 + 0.15003280712888888889e-12 * t) * t) * t) * t) * t) * t;
1206 }
1207 case 83: {
1208 double t = 2*y100 - 167;
1209 return 0.49243342227179841649e0 + (0.10037550043909497071e-1 + (0.11750334542845234952e-3 + (0.10544006716188967172e-5 + (0.73484461168242224872e-8 + (0.39383162326435752965e-10 + 0.15559069118222222222e-12 * t) * t) * t) * t) * t) * t;
1210 }
1211 case 84: {
1212 double t = 2*y100 - 169;
1213 return 0.51298708979209258326e0 + (0.10520454564612427224e-1 + (0.12400930037494996655e-3 + (0.11147886579371265246e-5 + (0.77517184550568711454e-8 + (0.41283980931872622611e-10 + 0.16122419680000000000e-12 * t) * t) * t) * t) * t) * t;
1214 }
1215 case 85: {
1216 double t = 2*y100 - 171;
1217 return 0.53453307979101369843e0 + (0.11030120618800726938e-1 + (0.13088741519572269581e-3 + (0.11784797595374515432e-5 + (0.81743383063044825400e-8 + (0.43252818449517081051e-10 + 0.16692592640000000000e-12 * t) * t) * t) * t) * t) * t;
1218 }
1219 case 86: {
1220 double t = 2*y100 - 173;
1221 return 0.55712643071169299478e0 + (0.11568077107929735233e-1 + (0.13815797838036651289e-3 + (0.12456314879260904558e-5 + (0.86169898078969313597e-8 + (0.45290446811539652525e-10 + 0.17268801084444444444e-12 * t) * t) * t) * t) * t) * t;
1222 }
1223 case 87: {
1224 double t = 2*y100 - 175;
1225 return 0.58082532122519320968e0 + (0.12135935999503877077e-1 + (0.14584223996665838559e-3 + (0.13164068573095710742e-5 + (0.90803643355106020163e-8 + (0.47397540713124619155e-10 + 0.17850211608888888889e-12 * t) * t) * t) * t) * t) * t;
1226 }
1227 case 88: {
1228 double t = 2*y100 - 177;
1229 return 0.60569124025293375554e0 + (0.12735396239525550361e-1 + (0.15396244472258863344e-3 + (0.13909744385382818253e-5 + (0.95651595032306228245e-8 + (0.49574672127669041550e-10 + 0.18435945564444444444e-12 * t) * t) * t) * t) * t) * t;
1230 }
1231 case 89: {
1232 double t = 2*y100 - 179;
1233 return 0.63178916494715716894e0 + (0.13368247798287030927e-1 + (0.16254186562762076141e-3 + (0.14695084048334056083e-5 + (0.10072078109604152350e-7 + (0.51822304995680707483e-10 + 0.19025081422222222222e-12 * t) * t) * t) * t) * t) * t;
1234 }
1235 case 90: {
1236 double t = 2*y100 - 181;
1237 return 0.65918774689725319200e0 + (0.14036375850601992063e-1 + (0.17160483760259706354e-3 + (0.15521885688723188371e-5 + (0.10601827031535280590e-7 + (0.54140790105837520499e-10 + 0.19616655146666666667e-12 * t) * t) * t) * t) * t) * t;
1238 }
1239 case 91: {
1240 double t = 2*y100 - 183;
1241 return 0.68795950683174433822e0 + (0.14741765091365869084e-1 + (0.18117679143520433835e-3 + (0.16392004108230585213e-5 + (0.11155116068018043001e-7 + (0.56530360194925690374e-10 + 0.20209663662222222222e-12 * t) * t) * t) * t) * t) * t;
1242 }
1243 case 92: {
1244 double t = 2*y100 - 185;
1245 return 0.71818103808729967036e0 + (0.15486504187117112279e-1 + (0.19128428784550923217e-3 + (0.17307350969359975848e-5 + (0.11732656736113607751e-7 + (0.58991125287563833603e-10 + 0.20803065333333333333e-12 * t) * t) * t) * t) * t) * t;
1246 }
1247 case 93: {
1248 double t = 2*y100 - 187;
1249 return 0.74993321911726254661e0 + (0.16272790364044783382e-1 + (0.20195505163377912645e-3 + (0.18269894883203346953e-5 + (0.12335161021630225535e-7 + (0.61523068312169087227e-10 + 0.21395783431111111111e-12 * t) * t) * t) * t) * t) * t;
1250 }
1251 case 94: {
1252 double t = 2*y100 - 189;
1253 return 0.78330143531283492729e0 + (0.17102934132652429240e-1 + (0.21321800585063327041e-3 + (0.19281661395543913713e-5 + (0.12963340087354341574e-7 + (0.64126040998066348872e-10 + 0.21986708942222222222e-12 * t) * t) * t) * t) * t) * t;
1254 }
1255 case 95: {
1256 double t = 2*y100 - 191;
1257 return 0.81837581041023811832e0 + (0.17979364149044223802e-1 + (0.22510330592753129006e-3 + (0.20344732868018175389e-5 + (0.13617902941839949718e-7 + (0.66799760083972474642e-10 + 0.22574701262222222222e-12 * t) * t) * t) * t) * t) * t;
1258 }
1259 case 96: {
1260 double t = 2*y100 - 193;
1261 return 0.85525144775685126237e0 + (0.18904632212547561026e-1 + (0.23764237370371255638e-3 + (0.21461248251306387979e-5 + (0.14299555071870523786e-7 + (0.69543803864694171934e-10 + 0.23158593688888888889e-12 * t) * t) * t) * t) * t) * t;
1262 }
1263 case 97: {
1264 double t = 2*y100 - 195;
1265 return 0.89402868170849933734e0 + (0.19881418399127202569e-1 + (0.25086793128395995798e-3 + (0.22633402747585233180e-5 + (0.15008997042116532283e-7 + (0.72357609075043941261e-10 + 0.23737194737777777778e-12 * t) * t) * t) * t) * t) * t;
1266 }
1267 case 98: {
1268 double t = 2*y100 - 197;
1269 return 0.93481333942870796363e0 + (0.20912536329780368893e-1 + (0.26481403465998477969e-3 + (0.23863447359754921676e-5 + (0.15746923065472184451e-7 + (0.75240468141720143653e-10 + 0.24309291271111111111e-12 * t) * t) * t) * t) * t) * t;
1270 }
1271 case 99: {
1272 double t = 2*y100 - 199;
1273 return 0.97771701335885035464e0 + (0.22000938572830479551e-1 + (0.27951610702682383001e-3 + (0.25153688325245314530e-5 + (0.16514019547822821453e-7 + (0.78191526829368231251e-10 + 0.24873652355555555556e-12 * t) * t) * t) * t) * t) * t;
1274 }
1275   }
1276   // we only get here if y = 1, i.e. |x| < 4*eps, in which case
1277   // erfcx is within 1e-15 of 1..
1278   return 1.0;
1279 }
1280 
erfcx(double x)1281 double Faddeeva::erfcx(double x)
1282 {
1283   if (x >= 0) {
1284     if (x > 50) { // continued-fraction expansion is faster
1285       const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
1286       if (x > 5e7) // 1-term expansion, important to avoid overflow
1287 	return ispi / x;
1288       /* 5-term expansion (rely on compiler for CSE), simplified from:
1289 	        ispi / (x+0.5/(x+1/(x+1.5/(x+2/x))))  */
1290       return ispi*((x*x) * (x*x+4.5) + 2) / (x * ((x*x) * (x*x+5) + 3.75));
1291     }
1292     return erfcx_y100(400/(4+x));
1293   }
1294   else
1295     return x < -26.7 ? HUGE_VAL : (x < -6.1 ? 2*exp(x*x)
1296 				   : 2*exp(x*x) - erfcx_y100(400/(4-x)));
1297 }
1298 
1299 /////////////////////////////////////////////////////////////////////////
1300 /* Compute a scaled Dawson integral
1301             Faddeeva::w_im(x) = 2*Dawson(x)/sqrt(pi)
1302    equivalent to the imaginary part w(x) for real x.
1303 
1304    Uses methods similar to the erfcx calculation above: continued fractions
1305    for large |x|, a lookup table of Chebyshev polynomials for smaller |x|,
1306    and finally a Taylor expansion for |x|<0.01.
1307 
1308    Steven G. Johnson, October 2012. */
1309 
1310 /* Given y100=100*y, where y = 1/(1+x) for x >= 0, compute w_im(x).
1311 
1312    Uses a look-up table of 100 different Chebyshev polynomials
1313    for y intervals [0,0.01], [0.01,0.02], ...., [0.99,1], generated
1314    with the help of Maple and a little shell script.   This allows
1315    the Chebyshev polynomials to be of significantly lower degree (about 1/30)
1316    compared to fitting the whole [0,1] interval with a single polynomial. */
w_im_y100(double y100,double x)1317 static double w_im_y100(double y100, double x) {
1318   switch ((int) y100) {
1319     case 0: {
1320       double t = 2*y100 - 1;
1321       return 0.28351593328822191546e-2 + (0.28494783221378400759e-2 + (0.14427470563276734183e-4 + (0.10939723080231588129e-6 + (0.92474307943275042045e-9 + (0.89128907666450075245e-11 + 0.92974121935111111110e-13 * t) * t) * t) * t) * t) * t;
1322     }
1323     case 1: {
1324       double t = 2*y100 - 3;
1325       return 0.85927161243940350562e-2 + (0.29085312941641339862e-2 + (0.15106783707725582090e-4 + (0.11716709978531327367e-6 + (0.10197387816021040024e-8 + (0.10122678863073360769e-10 + 0.10917479678400000000e-12 * t) * t) * t) * t) * t) * t;
1326     }
1327     case 2: {
1328       double t = 2*y100 - 5;
1329       return 0.14471159831187703054e-1 + (0.29703978970263836210e-2 + (0.15835096760173030976e-4 + (0.12574803383199211596e-6 + (0.11278672159518415848e-8 + (0.11547462300333495797e-10 + 0.12894535335111111111e-12 * t) * t) * t) * t) * t) * t;
1330     }
1331     case 3: {
1332       double t = 2*y100 - 7;
1333       return 0.20476320420324610618e-1 + (0.30352843012898665856e-2 + (0.16617609387003727409e-4 + (0.13525429711163116103e-6 + (0.12515095552507169013e-8 + (0.13235687543603382345e-10 + 0.15326595042666666667e-12 * t) * t) * t) * t) * t) * t;
1334     }
1335     case 4: {
1336       double t = 2*y100 - 9;
1337       return 0.26614461952489004566e-1 + (0.31034189276234947088e-2 + (0.17460268109986214274e-4 + (0.14582130824485709573e-6 + (0.13935959083809746345e-8 + (0.15249438072998932900e-10 + 0.18344741882133333333e-12 * t) * t) * t) * t) * t) * t;
1338     }
1339     case 5: {
1340       double t = 2*y100 - 11;
1341       return 0.32892330248093586215e-1 + (0.31750557067975068584e-2 + (0.18369907582308672632e-4 + (0.15761063702089457882e-6 + (0.15577638230480894382e-8 + (0.17663868462699097951e-10 + (0.22126732680711111111e-12 + 0.30273474177737853668e-14 * t) * t) * t) * t) * t) * t) * t;
1342     }
1343     case 6: {
1344       double t = 2*y100 - 13;
1345       return 0.39317207681134336024e-1 + (0.32504779701937539333e-2 + (0.19354426046513400534e-4 + (0.17081646971321290539e-6 + (0.17485733959327106250e-8 + (0.20593687304921961410e-10 + (0.26917401949155555556e-12 + 0.38562123837725712270e-14 * t) * t) * t) * t) * t) * t) * t;
1346     }
1347     case 7: {
1348       double t = 2*y100 - 15;
1349       return 0.45896976511367738235e-1 + (0.33300031273110976165e-2 + (0.20423005398039037313e-4 + (0.18567412470376467303e-6 + (0.19718038363586588213e-8 + (0.24175006536781219807e-10 + (0.33059982791466666666e-12 + 0.49756574284439426165e-14 * t) * t) * t) * t) * t) * t) * t;
1350     }
1351     case 8: {
1352       double t = 2*y100 - 17;
1353       return 0.52640192524848962855e-1 + (0.34139883358846720806e-2 + (0.21586390240603337337e-4 + (0.20247136501568904646e-6 + (0.22348696948197102935e-8 + (0.28597516301950162548e-10 + (0.41045502119111111110e-12 + 0.65151614515238361946e-14 * t) * t) * t) * t) * t) * t) * t;
1354     }
1355     case 9: {
1356       double t = 2*y100 - 19;
1357       return 0.59556171228656770456e-1 + (0.35028374386648914444e-2 + (0.22857246150998562824e-4 + (0.22156372146525190679e-6 + (0.25474171590893813583e-8 + (0.34122390890697400584e-10 + (0.51593189879111111110e-12 + 0.86775076853908006938e-14 * t) * t) * t) * t) * t) * t) * t;
1358     }
1359     case 10: {
1360       double t = 2*y100 - 21;
1361       return 0.66655089485108212551e-1 + (0.35970095381271285568e-2 + (0.24250626164318672928e-4 + (0.24339561521785040536e-6 + (0.29221990406518411415e-8 + (0.41117013527967776467e-10 + (0.65786450716444444445e-12 + 0.11791885745450623331e-13 * t) * t) * t) * t) * t) * t) * t;
1362     }
1363     case 11: {
1364       double t = 2*y100 - 23;
1365       return 0.73948106345519174661e-1 + (0.36970297216569341748e-2 + (0.25784588137312868792e-4 + (0.26853012002366752770e-6 + (0.33763958861206729592e-8 + (0.50111549981376976397e-10 + (0.85313857496888888890e-12 + 0.16417079927706899860e-13 * t) * t) * t) * t) * t) * t) * t;
1366     }
1367     case 12: {
1368       double t = 2*y100 - 25;
1369       return 0.81447508065002963203e-1 + (0.38035026606492705117e-2 + (0.27481027572231851896e-4 + (0.29769200731832331364e-6 + (0.39336816287457655076e-8 + (0.61895471132038157624e-10 + (0.11292303213511111111e-11 + 0.23558532213703884304e-13 * t) * t) * t) * t) * t) * t) * t;
1370     }
1371     case 13: {
1372       double t = 2*y100 - 27;
1373       return 0.89166884027582716628e-1 + (0.39171301322438946014e-2 + (0.29366827260422311668e-4 + (0.33183204390350724895e-6 + (0.46276006281647330524e-8 + (0.77692631378169813324e-10 + (0.15335153258844444444e-11 + 0.35183103415916026911e-13 * t) * t) * t) * t) * t) * t) * t;
1374     }
1375     case 14: {
1376       double t = 2*y100 - 29;
1377       return 0.97121342888032322019e-1 + (0.40387340353207909514e-2 + (0.31475490395950776930e-4 + (0.37222714227125135042e-6 + (0.55074373178613809996e-8 + (0.99509175283990337944e-10 + (0.21552645758222222222e-11 + 0.55728651431872687605e-13 * t) * t) * t) * t) * t) * t) * t;
1378     }
1379     case 15: {
1380       double t = 2*y100 - 31;
1381       return 0.10532778218603311137e0 + (0.41692873614065380607e-2 + (0.33849549774889456984e-4 + (0.42064596193692630143e-6 + (0.66494579697622432987e-8 + (0.13094103581931802337e-9 + (0.31896187409777777778e-11 + 0.97271974184476560742e-13 * t) * t) * t) * t) * t) * t) * t;
1382     }
1383     case 16: {
1384       double t = 2*y100 - 33;
1385       return 0.11380523107427108222e0 + (0.43099572287871821013e-2 + (0.36544324341565929930e-4 + (0.47965044028581857764e-6 + (0.81819034238463698796e-8 + (0.17934133239549647357e-9 + (0.50956666166186293627e-11 + (0.18850487318190638010e-12 + 0.79697813173519853340e-14 * t) * t) * t) * t) * t) * t) * t) * t;
1386     }
1387     case 17: {
1388       double t = 2*y100 - 35;
1389       return 0.12257529703447467345e0 + (0.44621675710026986366e-2 + (0.39634304721292440285e-4 + (0.55321553769873381819e-6 + (0.10343619428848520870e-7 + (0.26033830170470368088e-9 + (0.87743837749108025357e-11 + (0.34427092430230063401e-12 + 0.10205506615709843189e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1390     }
1391     case 18: {
1392       double t = 2*y100 - 37;
1393       return 0.13166276955656699478e0 + (0.46276970481783001803e-2 + (0.43225026380496399310e-4 + (0.64799164020016902656e-6 + (0.13580082794704641782e-7 + (0.39839800853954313927e-9 + (0.14431142411840000000e-10 + 0.42193457308830027541e-12 * t) * t) * t) * t) * t) * t) * t;
1394     }
1395     case 19: {
1396       double t = 2*y100 - 39;
1397       return 0.14109647869803356475e0 + (0.48088424418545347758e-2 + (0.47474504753352150205e-4 + (0.77509866468724360352e-6 + (0.18536851570794291724e-7 + (0.60146623257887570439e-9 + (0.18533978397305276318e-10 + (0.41033845938901048380e-13 - 0.46160680279304825485e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1398     }
1399     case 20: {
1400       double t = 2*y100 - 41;
1401       return 0.15091057940548936603e0 + (0.50086864672004685703e-2 + (0.52622482832192230762e-4 + (0.95034664722040355212e-6 + (0.25614261331144718769e-7 + (0.80183196716888606252e-9 + (0.12282524750534352272e-10 + (-0.10531774117332273617e-11 - 0.86157181395039646412e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1402     }
1403     case 21: {
1404       double t = 2*y100 - 43;
1405       return 0.16114648116017010770e0 + (0.52314661581655369795e-2 + (0.59005534545908331315e-4 + (0.11885518333915387760e-5 + (0.33975801443239949256e-7 + (0.82111547144080388610e-9 + (-0.12357674017312854138e-10 + (-0.24355112256914479176e-11 - 0.75155506863572930844e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1406     }
1407     case 22: {
1408       double t = 2*y100 - 45;
1409       return 0.17185551279680451144e0 + (0.54829002967599420860e-2 + (0.67013226658738082118e-4 + (0.14897400671425088807e-5 + (0.40690283917126153701e-7 + (0.44060872913473778318e-9 + (-0.52641873433280000000e-10 - 0.30940587864543343124e-11 * t) * t) * t) * t) * t) * t) * t;
1410     }
1411     case 23: {
1412       double t = 2*y100 - 47;
1413       return 0.18310194559815257381e0 + (0.57701559375966953174e-2 + (0.76948789401735193483e-4 + (0.18227569842290822512e-5 + (0.41092208344387212276e-7 + (-0.44009499965694442143e-9 + (-0.92195414685628803451e-10 + (-0.22657389705721753299e-11 + 0.10004784908106839254e-12 * t) * t) * t) * t) * t) * t) * t) * t;
1414     }
1415     case 24: {
1416       double t = 2*y100 - 49;
1417       return 0.19496527191546630345e0 + (0.61010853144364724856e-2 + (0.88812881056342004864e-4 + (0.21180686746360261031e-5 + (0.30652145555130049203e-7 + (-0.16841328574105890409e-8 + (-0.11008129460612823934e-9 + (-0.12180794204544515779e-12 + 0.15703325634590334097e-12 * t) * t) * t) * t) * t) * t) * t) * t;
1418     }
1419     case 25: {
1420       double t = 2*y100 - 51;
1421       return 0.20754006813966575720e0 + (0.64825787724922073908e-2 + (0.10209599627522311893e-3 + (0.22785233392557600468e-5 + (0.73495224449907568402e-8 + (-0.29442705974150112783e-8 + (-0.94082603434315016546e-10 + (0.23609990400179321267e-11 + 0.14141908654269023788e-12 * t) * t) * t) * t) * t) * t) * t) * t;
1422     }
1423     case 26: {
1424       double t = 2*y100 - 53;
1425       return 0.22093185554845172146e0 + (0.69182878150187964499e-2 + (0.11568723331156335712e-3 + (0.22060577946323627739e-5 + (-0.26929730679360840096e-7 + (-0.38176506152362058013e-8 + (-0.47399503861054459243e-10 + (0.40953700187172127264e-11 + 0.69157730376118511127e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1426     }
1427     case 27: {
1428       double t = 2*y100 - 55;
1429       return 0.23524827304057813918e0 + (0.74063350762008734520e-2 + (0.12796333874615790348e-3 + (0.18327267316171054273e-5 + (-0.66742910737957100098e-7 + (-0.40204740975496797870e-8 + (0.14515984139495745330e-10 + (0.44921608954536047975e-11 - 0.18583341338983776219e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1430     }
1431     case 28: {
1432       double t = 2*y100 - 57;
1433       return 0.25058626331812744775e0 + (0.79377285151602061328e-2 + (0.13704268650417478346e-3 + (0.11427511739544695861e-5 + (-0.10485442447768377485e-6 + (-0.34850364756499369763e-8 + (0.72656453829502179208e-10 + (0.36195460197779299406e-11 - 0.84882136022200714710e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1434     }
1435     case 29: {
1436       double t = 2*y100 - 59;
1437       return 0.26701724900280689785e0 + (0.84959936119625864274e-2 + (0.14112359443938883232e-3 + (0.17800427288596909634e-6 + (-0.13443492107643109071e-6 + (-0.23512456315677680293e-8 + (0.11245846264695936769e-9 + (0.19850501334649565404e-11 - 0.11284666134635050832e-12 * t) * t) * t) * t) * t) * t) * t) * t;
1438     }
1439     case 30: {
1440       double t = 2*y100 - 61;
1441       return 0.28457293586253654144e0 + (0.90581563892650431899e-2 + (0.13880520331140646738e-3 + (-0.97262302362522896157e-6 + (-0.15077100040254187366e-6 + (-0.88574317464577116689e-9 + (0.12760311125637474581e-9 + (0.20155151018282695055e-12 - 0.10514169375181734921e-12 * t) * t) * t) * t) * t) * t) * t) * t;
1442     }
1443     case 31: {
1444       double t = 2*y100 - 63;
1445       return 0.30323425595617385705e0 + (0.95968346790597422934e-2 + (0.12931067776725883939e-3 + (-0.21938741702795543986e-5 + (-0.15202888584907373963e-6 + (0.61788350541116331411e-9 + (0.11957835742791248256e-9 + (-0.12598179834007710908e-11 - 0.75151817129574614194e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1446     }
1447     case 32: {
1448       double t = 2*y100 - 65;
1449       return 0.32292521181517384379e0 + (0.10082957727001199408e-1 + (0.11257589426154962226e-3 + (-0.33670890319327881129e-5 + (-0.13910529040004008158e-6 + (0.19170714373047512945e-8 + (0.94840222377720494290e-10 + (-0.21650018351795353201e-11 - 0.37875211678024922689e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1450     }
1451     case 33: {
1452       double t = 2*y100 - 67;
1453       return 0.34351233557911753862e0 + (0.10488575435572745309e-1 + (0.89209444197248726614e-4 + (-0.43893459576483345364e-5 + (-0.11488595830450424419e-6 + (0.28599494117122464806e-8 + (0.61537542799857777779e-10 - 0.24935749227658002212e-11 * t) * t) * t) * t) * t) * t) * t;
1454     }
1455     case 34: {
1456       double t = 2*y100 - 69;
1457       return 0.36480946642143669093e0 + (0.10789304203431861366e-1 + (0.60357993745283076834e-4 + (-0.51855862174130669389e-5 + (-0.83291664087289801313e-7 + (0.33898011178582671546e-8 + (0.27082948188277716482e-10 + (-0.23603379397408694974e-11 + 0.19328087692252869842e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1458     }
1459     case 35: {
1460       double t = 2*y100 - 71;
1461       return 0.38658679935694939199e0 + (0.10966119158288804999e-1 + (0.27521612041849561426e-4 + (-0.57132774537670953638e-5 + (-0.48404772799207914899e-7 + (0.35268354132474570493e-8 + (-0.32383477652514618094e-11 + (-0.19334202915190442501e-11 + 0.32333189861286460270e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1462     }
1463     case 36: {
1464       double t = 2*y100 - 73;
1465       return 0.40858275583808707870e0 + (0.11006378016848466550e-1 + (-0.76396376685213286033e-5 + (-0.59609835484245791439e-5 + (-0.13834610033859313213e-7 + (0.33406952974861448790e-8 + (-0.26474915974296612559e-10 + (-0.13750229270354351983e-11 + 0.36169366979417390637e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1466     }
1467     case 37: {
1468       double t = 2*y100 - 75;
1469       return 0.43051714914006682977e0 + (0.10904106549500816155e-1 + (-0.43477527256787216909e-4 + (-0.59429739547798343948e-5 + (0.17639200194091885949e-7 + (0.29235991689639918688e-8 + (-0.41718791216277812879e-10 + (-0.81023337739508049606e-12 + 0.33618915934461994428e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1470     }
1471     case 38: {
1472       double t = 2*y100 - 77;
1473       return 0.45210428135559607406e0 + (0.10659670756384400554e-1 + (-0.78488639913256978087e-4 + (-0.56919860886214735936e-5 + (0.44181850467477733407e-7 + (0.23694306174312688151e-8 + (-0.49492621596685443247e-10 + (-0.31827275712126287222e-12 + 0.27494438742721623654e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1474     }
1475     case 39: {
1476       double t = 2*y100 - 79;
1477       return 0.47306491195005224077e0 + (0.10279006119745977570e-1 + (-0.11140268171830478306e-3 + (-0.52518035247451432069e-5 + (0.64846898158889479518e-7 + (0.17603624837787337662e-8 + (-0.51129481592926104316e-10 + (0.62674584974141049511e-13 + 0.20055478560829935356e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1478     }
1479     case 40: {
1480       double t = 2*y100 - 81;
1481       return 0.49313638965719857647e0 + (0.97725799114772017662e-2 + (-0.14122854267291533334e-3 + (-0.46707252568834951907e-5 + (0.79421347979319449524e-7 + (0.11603027184324708643e-8 + (-0.48269605844397175946e-10 + (0.32477251431748571219e-12 + 0.12831052634143527985e-13 * t) * t) * t) * t) * t) * t) * t) * t;
1482     }
1483     case 41: {
1484       double t = 2*y100 - 83;
1485       return 0.51208057433416004042e0 + (0.91542422354009224951e-2 + (-0.16726530230228647275e-3 + (-0.39964621752527649409e-5 + (0.88232252903213171454e-7 + (0.61343113364949928501e-9 + (-0.42516755603130443051e-10 + (0.47910437172240209262e-12 + 0.66784341874437478953e-14 * t) * t) * t) * t) * t) * t) * t) * t;
1486     }
1487     case 42: {
1488       double t = 2*y100 - 85;
1489       return 0.52968945458607484524e0 + (0.84400880445116786088e-2 + (-0.18908729783854258774e-3 + (-0.32725905467782951931e-5 + (0.91956190588652090659e-7 + (0.14593989152420122909e-9 + (-0.35239490687644444445e-10 + 0.54613829888448694898e-12 * t) * t) * t) * t) * t) * t) * t;
1490     }
1491     case 43: {
1492       double t = 2*y100 - 87;
1493       return 0.54578857454330070965e0 + (0.76474155195880295311e-2 + (-0.20651230590808213884e-3 + (-0.25364339140543131706e-5 + (0.91455367999510681979e-7 + (-0.23061359005297528898e-9 + (-0.27512928625244444444e-10 + 0.54895806008493285579e-12 * t) * t) * t) * t) * t) * t) * t;
1494     }
1495     case 44: {
1496       double t = 2*y100 - 89;
1497       return 0.56023851910298493910e0 + (0.67938321739997196804e-2 + (-0.21956066613331411760e-3 + (-0.18181127670443266395e-5 + (0.87650335075416845987e-7 + (-0.51548062050366615977e-9 + (-0.20068462174044444444e-10 + 0.50912654909758187264e-12 * t) * t) * t) * t) * t) * t) * t;
1498     }
1499     case 45: {
1500       double t = 2*y100 - 91;
1501       return 0.57293478057455721150e0 + (0.58965321010394044087e-2 + (-0.22841145229276575597e-3 + (-0.11404605562013443659e-5 + (0.81430290992322326296e-7 + (-0.71512447242755357629e-9 + (-0.13372664928000000000e-10 + 0.44461498336689298148e-12 * t) * t) * t) * t) * t) * t) * t;
1502     }
1503     case 46: {
1504       double t = 2*y100 - 93;
1505       return 0.58380635448407827360e0 + (0.49717469530842831182e-2 + (-0.23336001540009645365e-3 + (-0.51952064448608850822e-6 + (0.73596577815411080511e-7 + (-0.84020916763091566035e-9 + (-0.76700972702222222221e-11 + 0.36914462807972467044e-12 * t) * t) * t) * t) * t) * t) * t;
1506     }
1507     case 47: {
1508       double t = 2*y100 - 95;
1509       return 0.59281340237769489597e0 + (0.40343592069379730568e-2 + (-0.23477963738658326185e-3 + (0.34615944987790224234e-7 + (0.64832803248395814574e-7 + (-0.90329163587627007971e-9 + (-0.30421940400000000000e-11 + 0.29237386653743536669e-12 * t) * t) * t) * t) * t) * t) * t;
1510     }
1511     case 48: {
1512       double t = 2*y100 - 97;
1513       return 0.59994428743114271918e0 + (0.30976579788271744329e-2 + (-0.23308875765700082835e-3 + (0.51681681023846925160e-6 + (0.55694594264948268169e-7 + (-0.91719117313243464652e-9 + (0.53982743680000000000e-12 + 0.22050829296187771142e-12 * t) * t) * t) * t) * t) * t) * t;
1514     }
1515     case 49: {
1516       double t = 2*y100 - 99;
1517       return 0.60521224471819875444e0 + (0.21732138012345456060e-2 + (-0.22872428969625997456e-3 + (0.92588959922653404233e-6 + (0.46612665806531930684e-7 + (-0.89393722514414153351e-9 + (0.31718550353777777778e-11 + 0.15705458816080549117e-12 * t) * t) * t) * t) * t) * t) * t;
1518     }
1519     case 50: {
1520       double t = 2*y100 - 101;
1521       return 0.60865189969791123620e0 + (0.12708480848877451719e-2 + (-0.22212090111534847166e-3 + (0.12636236031532793467e-5 + (0.37904037100232937574e-7 + (-0.84417089968101223519e-9 + (0.49843180828444444445e-11 + 0.10355439441049048273e-12 * t) * t) * t) * t) * t) * t) * t;
1522     }
1523     case 51: {
1524       double t = 2*y100 - 103;
1525       return 0.61031580103499200191e0 + (0.39867436055861038223e-3 + (-0.21369573439579869291e-3 + (0.15339402129026183670e-5 + (0.29787479206646594442e-7 + (-0.77687792914228632974e-9 + (0.61192452741333333334e-11 + 0.60216691829459295780e-13 * t) * t) * t) * t) * t) * t) * t;
1526     }
1527     case 52: {
1528       double t = 2*y100 - 105;
1529       return 0.61027109047879835868e0 + (-0.43680904508059878254e-3 + (-0.20383783788303894442e-3 + (0.17421743090883439959e-5 + (0.22400425572175715576e-7 + (-0.69934719320045128997e-9 + (0.67152759655111111110e-11 + 0.26419960042578359995e-13 * t) * t) * t) * t) * t) * t) * t;
1530     }
1531     case 53: {
1532       double t = 2*y100 - 107;
1533       return 0.60859639489217430521e0 + (-0.12305921390962936873e-2 + (-0.19290150253894682629e-3 + (0.18944904654478310128e-5 + (0.15815530398618149110e-7 + (-0.61726850580964876070e-9 + 0.68987888999111111110e-11 * t) * t) * t) * t) * t) * t;
1534     }
1535     case 54: {
1536       double t = 2*y100 - 109;
1537       return 0.60537899426486075181e0 + (-0.19790062241395705751e-2 + (-0.18120271393047062253e-3 + (0.19974264162313241405e-5 + (0.10055795094298172492e-7 + (-0.53491997919318263593e-9 + (0.67794550295111111110e-11 - 0.17059208095741511603e-13 * t) * t) * t) * t) * t) * t) * t;
1538     }
1539     case 55: {
1540       double t = 2*y100 - 111;
1541       return 0.60071229457904110537e0 + (-0.26795676776166354354e-2 + (-0.16901799553627508781e-3 + (0.20575498324332621581e-5 + (0.51077165074461745053e-8 + (-0.45536079828057221858e-9 + (0.64488005516444444445e-11 - 0.29311677573152766338e-13 * t) * t) * t) * t) * t) * t) * t;
1542     }
1543     case 56: {
1544       double t = 2*y100 - 113;
1545       return 0.59469361520112714738e0 + (-0.33308208190600993470e-2 + (-0.15658501295912405679e-3 + (0.20812116912895417272e-5 + (0.93227468760614182021e-9 + (-0.38066673740116080415e-9 + (0.59806790359111111110e-11 - 0.36887077278950440597e-13 * t) * t) * t) * t) * t) * t) * t;
1546     }
1547     case 57: {
1548       double t = 2*y100 - 115;
1549       return 0.58742228631775388268e0 + (-0.39321858196059227251e-2 + (-0.14410441141450122535e-3 + (0.20743790018404020716e-5 + (-0.25261903811221913762e-8 + (-0.31212416519526924318e-9 + (0.54328422462222222221e-11 - 0.40864152484979815972e-13 * t) * t) * t) * t) * t) * t) * t;
1550     }
1551     case 58: {
1552       double t = 2*y100 - 117;
1553       return 0.57899804200033018447e0 + (-0.44838157005618913447e-2 + (-0.13174245966501437965e-3 + (0.20425306888294362674e-5 + (-0.53330296023875447782e-8 + (-0.25041289435539821014e-9 + (0.48490437205333333334e-11 - 0.42162206939169045177e-13 * t) * t) * t) * t) * t) * t) * t;
1554     }
1555     case 59: {
1556       double t = 2*y100 - 119;
1557       return 0.56951968796931245974e0 + (-0.49864649488074868952e-2 + (-0.11963416583477567125e-3 + (0.19906021780991036425e-5 + (-0.75580140299436494248e-8 + (-0.19576060961919820491e-9 + (0.42613011928888888890e-11 - 0.41539443304115604377e-13 * t) * t) * t) * t) * t) * t) * t;
1558     }
1559     case 60: {
1560       double t = 2*y100 - 121;
1561       return 0.55908401930063918964e0 + (-0.54413711036826877753e-2 + (-0.10788661102511914628e-3 + (0.19229663322982839331e-5 + (-0.92714731195118129616e-8 + (-0.14807038677197394186e-9 + (0.36920870298666666666e-11 - 0.39603726688419162617e-13 * t) * t) * t) * t) * t) * t) * t;
1562     }
1563     case 61: {
1564       double t = 2*y100 - 123;
1565       return 0.54778496152925675315e0 + (-0.58501497933213396670e-2 + (-0.96582314317855227421e-4 + (0.18434405235069270228e-5 + (-0.10541580254317078711e-7 + (-0.10702303407788943498e-9 + (0.31563175582222222222e-11 - 0.36829748079110481422e-13 * t) * t) * t) * t) * t) * t) * t;
1566     }
1567     case 62: {
1568       double t = 2*y100 - 125;
1569       return 0.53571290831682823999e0 + (-0.62147030670760791791e-2 + (-0.85782497917111760790e-4 + (0.17553116363443470478e-5 + (-0.11432547349815541084e-7 + (-0.72157091369041330520e-10 + (0.26630811607111111111e-11 - 0.33578660425893164084e-13 * t) * t) * t) * t) * t) * t) * t;
1570     }
1571     case 63: {
1572       double t = 2*y100 - 127;
1573       return 0.52295422962048434978e0 + (-0.65371404367776320720e-2 + (-0.75530164941473343780e-4 + (0.16613725797181276790e-5 + (-0.12003521296598910761e-7 + (-0.42929753689181106171e-10 + (0.22170894940444444444e-11 - 0.30117697501065110505e-13 * t) * t) * t) * t) * t) * t) * t;
1574     }
1575     case 64: {
1576       double t = 2*y100 - 129;
1577       return 0.50959092577577886140e0 + (-0.68197117603118591766e-2 + (-0.65852936198953623307e-4 + (0.15639654113906716939e-5 + (-0.12308007991056524902e-7 + (-0.18761997536910939570e-10 + (0.18198628922666666667e-11 - 0.26638355362285200932e-13 * t) * t) * t) * t) * t) * t) * t;
1578     }
1579     case 65: {
1580       double t = 2*y100 - 131;
1581       return 0.49570040481823167970e0 + (-0.70647509397614398066e-2 + (-0.56765617728962588218e-4 + (0.14650274449141448497e-5 + (-0.12393681471984051132e-7 + (0.92904351801168955424e-12 + (0.14706755960177777778e-11 - 0.23272455351266325318e-13 * t) * t) * t) * t) * t) * t) * t;
1582     }
1583     case 66: {
1584       double t = 2*y100 - 133;
1585       return 0.48135536250935238066e0 + (-0.72746293327402359783e-2 + (-0.48272489495730030780e-4 + (0.13661377309113939689e-5 + (-0.12302464447599382189e-7 + (0.16707760028737074907e-10 + (0.11672928324444444444e-11 - 0.20105801424709924499e-13 * t) * t) * t) * t) * t) * t) * t;
1586     }
1587     case 67: {
1588       double t = 2*y100 - 135;
1589       return 0.46662374675511439448e0 + (-0.74517177649528487002e-2 + (-0.40369318744279128718e-4 + (0.12685621118898535407e-5 + (-0.12070791463315156250e-7 + (0.29105507892605823871e-10 + (0.90653314645333333334e-12 - 0.17189503312102982646e-13 * t) * t) * t) * t) * t) * t) * t;
1590     }
1591     case 68: {
1592       double t = 2*y100 - 137;
1593       return 0.45156879030168268778e0 + (-0.75983560650033817497e-2 + (-0.33045110380705139759e-4 + (0.11732956732035040896e-5 + (-0.11729986947158201869e-7 + (0.38611905704166441308e-10 + (0.68468768305777777779e-12 - 0.14549134330396754575e-13 * t) * t) * t) * t) * t) * t) * t;
1594     }
1595     case 69: {
1596       double t = 2*y100 - 139;
1597       return 0.43624909769330896904e0 + (-0.77168291040309554679e-2 + (-0.26283612321339907756e-4 + (0.10811018836893550820e-5 + (-0.11306707563739851552e-7 + (0.45670446788529607380e-10 + (0.49782492549333333334e-12 - 0.12191983967561779442e-13 * t) * t) * t) * t) * t) * t) * t;
1598     }
1599     case 70: {
1600       double t = 2*y100 - 141;
1601       return 0.42071877443548481181e0 + (-0.78093484015052730097e-2 + (-0.20064596897224934705e-4 + (0.99254806680671890766e-6 + (-0.10823412088884741451e-7 + (0.50677203326904716247e-10 + (0.34200547594666666666e-12 - 0.10112698698356194618e-13 * t) * t) * t) * t) * t) * t) * t;
1602     }
1603     case 71: {
1604       double t = 2*y100 - 143;
1605       return 0.40502758809710844280e0 + (-0.78780384460872937555e-2 + (-0.14364940764532853112e-4 + (0.90803709228265217384e-6 + (-0.10298832847014466907e-7 + (0.53981671221969478551e-10 + (0.21342751381333333333e-12 - 0.82975901848387729274e-14 * t) * t) * t) * t) * t) * t) * t;
1606     }
1607     case 72: {
1608       double t = 2*y100 - 145;
1609       return 0.38922115269731446690e0 + (-0.79249269708242064120e-2 + (-0.91595258799106970453e-5 + (0.82783535102217576495e-6 + (-0.97484311059617744437e-8 + (0.55889029041660225629e-10 + (0.10851981336888888889e-12 - 0.67278553237853459757e-14 * t) * t) * t) * t) * t) * t) * t;
1610     }
1611     case 73: {
1612       double t = 2*y100 - 147;
1613       return 0.37334112915460307335e0 + (-0.79519385109223148791e-2 + (-0.44219833548840469752e-5 + (0.75209719038240314732e-6 + (-0.91848251458553190451e-8 + (0.56663266668051433844e-10 + (0.23995894257777777778e-13 - 0.53819475285389344313e-14 * t) * t) * t) * t) * t) * t) * t;
1614     }
1615     case 74: {
1616       double t = 2*y100 - 149;
1617       return 0.35742543583374223085e0 + (-0.79608906571527956177e-2 + (-0.12530071050975781198e-6 + (0.68088605744900552505e-6 + (-0.86181844090844164075e-8 + (0.56530784203816176153e-10 + (-0.43120012248888888890e-13 - 0.42372603392496813810e-14 * t) * t) * t) * t) * t) * t) * t;
1618     }
1619     case 75: {
1620       double t = 2*y100 - 151;
1621       return 0.34150846431979618536e0 + (-0.79534924968773806029e-2 + (0.37576885610891515813e-5 + (0.61419263633090524326e-6 + (-0.80565865409945960125e-8 + (0.55684175248749269411e-10 + (-0.95486860764444444445e-13 - 0.32712946432984510595e-14 * t) * t) * t) * t) * t) * t) * t;
1622     }
1623     case 76: {
1624       double t = 2*y100 - 153;
1625       return 0.32562129649136346824e0 + (-0.79313448067948884309e-2 + (0.72539159933545300034e-5 + (0.55195028297415503083e-6 + (-0.75063365335570475258e-8 + (0.54281686749699595941e-10 - 0.13545424295111111111e-12 * t) * t) * t) * t) * t) * t;
1626     }
1627     case 77: {
1628       double t = 2*y100 - 155;
1629       return 0.30979191977078391864e0 + (-0.78959416264207333695e-2 + (0.10389774377677210794e-4 + (0.49404804463196316464e-6 + (-0.69722488229411164685e-8 + (0.52469254655951393842e-10 - 0.16507860650666666667e-12 * t) * t) * t) * t) * t) * t;
1630     }
1631     case 78: {
1632       double t = 2*y100 - 157;
1633       return 0.29404543811214459904e0 + (-0.78486728990364155356e-2 + (0.13190885683106990459e-4 + (0.44034158861387909694e-6 + (-0.64578942561562616481e-8 + (0.50354306498006928984e-10 - 0.18614473550222222222e-12 * t) * t) * t) * t) * t) * t;
1634     }
1635     case 79: {
1636       double t = 2*y100 - 159;
1637       return 0.27840427686253660515e0 + (-0.77908279176252742013e-2 + (0.15681928798708548349e-4 + (0.39066226205099807573e-6 + (-0.59658144820660420814e-8 + (0.48030086420373141763e-10 - 0.20018995173333333333e-12 * t) * t) * t) * t) * t) * t;
1638     }
1639     case 80: {
1640       double t = 2*y100 - 161;
1641       return 0.26288838011163800908e0 + (-0.77235993576119469018e-2 + (0.17886516796198660969e-4 + (0.34482457073472497720e-6 + (-0.54977066551955420066e-8 + (0.45572749379147269213e-10 - 0.20852924954666666667e-12 * t) * t) * t) * t) * t) * t;
1642     }
1643     case 81: {
1644       double t = 2*y100 - 163;
1645       return 0.24751539954181029717e0 + (-0.76480877165290370975e-2 + (0.19827114835033977049e-4 + (0.30263228619976332110e-6 + (-0.50545814570120129947e-8 + (0.43043879374212005966e-10 - 0.21228012028444444444e-12 * t) * t) * t) * t) * t) * t;
1646     }
1647     case 82: {
1648       double t = 2*y100 - 165;
1649       return 0.23230087411688914593e0 + (-0.75653060136384041587e-2 + (0.21524991113020016415e-4 + (0.26388338542539382413e-6 + (-0.46368974069671446622e-8 + (0.40492715758206515307e-10 - 0.21238627815111111111e-12 * t) * t) * t) * t) * t) * t;
1650     }
1651     case 83: {
1652       double t = 2*y100 - 167;
1653       return 0.21725840021297341931e0 + (-0.74761846305979730439e-2 + (0.23000194404129495243e-4 + (0.22837400135642906796e-6 + (-0.42446743058417541277e-8 + (0.37958104071765923728e-10 - 0.20963978568888888889e-12 * t) * t) * t) * t) * t) * t;
1654     }
1655     case 84: {
1656       double t = 2*y100 - 169;
1657       return 0.20239979200788191491e0 + (-0.73815761980493466516e-2 + (0.24271552727631854013e-4 + (0.19590154043390012843e-6 + (-0.38775884642456551753e-8 + (0.35470192372162901168e-10 - 0.20470131678222222222e-12 * t) * t) * t) * t) * t) * t;
1658     }
1659     case 85: {
1660       double t = 2*y100 - 171;
1661       return 0.18773523211558098962e0 + (-0.72822604530339834448e-2 + (0.25356688567841293697e-4 + (0.16626710297744290016e-6 + (-0.35350521468015310830e-8 + (0.33051896213898864306e-10 - 0.19811844544000000000e-12 * t) * t) * t) * t) * t) * t;
1662     }
1663     case 86: {
1664       double t = 2*y100 - 173;
1665       return 0.17327341258479649442e0 + (-0.71789490089142761950e-2 + (0.26272046822383820476e-4 + (0.13927732375657362345e-6 + (-0.32162794266956859603e-8 + (0.30720156036105652035e-10 - 0.19034196304000000000e-12 * t) * t) * t) * t) * t) * t;
1666     }
1667     case 87: {
1668       double t = 2*y100 - 175;
1669       return 0.15902166648328672043e0 + (-0.70722899934245504034e-2 + (0.27032932310132226025e-4 + (0.11474573347816568279e-6 + (-0.29203404091754665063e-8 + (0.28487010262547971859e-10 - 0.18174029063111111111e-12 * t) * t) * t) * t) * t) * t;
1670     }
1671     case 88: {
1672       double t = 2*y100 - 177;
1673       return 0.14498609036610283865e0 + (-0.69628725220045029273e-2 + (0.27653554229160596221e-4 + (0.92493727167393036470e-7 + (-0.26462055548683583849e-8 + (0.26360506250989943739e-10 - 0.17261211260444444444e-12 * t) * t) * t) * t) * t) * t;
1674     }
1675     case 89: {
1676       double t = 2*y100 - 179;
1677       return 0.13117165798208050667e0 + (-0.68512309830281084723e-2 + (0.28147075431133863774e-4 + (0.72351212437979583441e-7 + (-0.23927816200314358570e-8 + (0.24345469651209833155e-10 - 0.16319736960000000000e-12 * t) * t) * t) * t) * t) * t;
1678     }
1679     case 90: {
1680       double t = 2*y100 - 181;
1681       return 0.11758232561160626306e0 + (-0.67378491192463392927e-2 + (0.28525664781722907847e-4 + (0.54156999310046790024e-7 + (-0.21589405340123827823e-8 + (0.22444150951727334619e-10 - 0.15368675584000000000e-12 * t) * t) * t) * t) * t) * t;
1682     }
1683     case 91: {
1684       double t = 2*y100 - 183;
1685       return 0.10422112945361673560e0 + (-0.66231638959845581564e-2 + (0.28800551216363918088e-4 + (0.37758983397952149613e-7 + (-0.19435423557038933431e-8 + (0.20656766125421362458e-10 - 0.14422990012444444444e-12 * t) * t) * t) * t) * t) * t;
1686     }
1687     case 92: {
1688       double t = 2*y100 - 185;
1689       return 0.91090275493541084785e-1 + (-0.65075691516115160062e-2 + (0.28982078385527224867e-4 + (0.23014165807643012781e-7 + (-0.17454532910249875958e-8 + (0.18981946442680092373e-10 - 0.13494234691555555556e-12 * t) * t) * t) * t) * t) * t;
1690     }
1691     case 93: {
1692       double t = 2*y100 - 187;
1693       return 0.78191222288771379358e-1 + (-0.63914190297303976434e-2 + (0.29079759021299682675e-4 + (0.97885458059415717014e-8 + (-0.15635596116134296819e-8 + (0.17417110744051331974e-10 - 0.12591151763555555556e-12 * t) * t) * t) * t) * t) * t;
1694     }
1695     case 94: {
1696       double t = 2*y100 - 189;
1697       return 0.65524757106147402224e-1 + (-0.62750311956082444159e-2 + (0.29102328354323449795e-4 + (-0.20430838882727954582e-8 + (-0.13967781903855367270e-8 + (0.15958771833747057569e-10 - 0.11720175765333333333e-12 * t) * t) * t) * t) * t) * t;
1698     }
1699     case 95: {
1700       double t = 2*y100 - 191;
1701       return 0.53091065838453612773e-1 + (-0.61586898417077043662e-2 + (0.29057796072960100710e-4 + (-0.12597414620517987536e-7 + (-0.12440642607426861943e-8 + (0.14602787128447932137e-10 - 0.10885859114666666667e-12 * t) * t) * t) * t) * t) * t;
1702     }
1703     case 96: {
1704       double t = 2*y100 - 193;
1705       return 0.40889797115352738582e-1 + (-0.60426484889413678200e-2 + (0.28953496450191694606e-4 + (-0.21982952021823718400e-7 + (-0.11044169117553026211e-8 + (0.13344562332430552171e-10 - 0.10091231402844444444e-12 * t) * t) * t) * t) * t) * t;
1706     }
1707     case 97: {
1708       double t = 2*y100 - 195;
1709       return 0.28920121009594899986e-1 + (-0.59271325915413781788e-2 + (0.28796136372768177423e-4 + (-0.30300382596279568642e-7 + (-0.97688275022802329749e-9 + (0.12179215701512592356e-10 - 0.93380988481777777779e-13 * t) * t) * t) * t) * t) * t;
1710     }
1711     case 98: {
1712       double t = 2*y100 - 197;
1713       return 0.17180782722617876655e-1 + (-0.58123419543161127769e-2 + (0.28591841095380959666e-4 + (-0.37642963496443667043e-7 + (-0.86055809047367300024e-9 + (0.11101709356762665578e-10 - 0.86272947493333333334e-13 * t) * t) * t) * t) * t) * t;
1714     }
1715   case 99: case 100: { // use Taylor expansion for small x (|x| <= 0.010101...)
1716       //  (2/sqrt(pi)) * (x - 2/3 x^3  + 4/15 x^5  - 8/105 x^7)
1717       double x2 = x*x;
1718       return x * (1.1283791670955125739
1719 		  - x2 * (0.75225277806367504925
1720 			  - x2 * (0.30090111122547001970
1721 				  - x2 * 0.085971746064420005629)));
1722     }
1723   }
1724   /* Since 0 <= y100 < 101, this is only reached if x is NaN,
1725      in which case we should return NaN. */
1726   return NaN;
1727 }
1728 
w_im(double x)1729 double Faddeeva::w_im(double x)
1730 {
1731   if (x >= 0) {
1732     if (x > 45) { // continued-fraction expansion is faster
1733       const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
1734       if (x > 5e7) // 1-term expansion, important to avoid overflow
1735 	return ispi / x;
1736       /* 5-term expansion (rely on compiler for CSE), simplified from:
1737 	        ispi / (x-0.5/(x-1/(x-1.5/(x-2/x))))  */
1738       return ispi*((x*x) * (x*x-4.5) + 2) / (x * ((x*x) * (x*x-5) + 3.75));
1739     }
1740     return w_im_y100(100/(1+x), x);
1741   }
1742   else { // = -Faddeeva::w_im(-x)
1743     if (x < -45) { // continued-fraction expansion is faster
1744       const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
1745       if (x < -5e7) // 1-term expansion, important to avoid overflow
1746 	return ispi / x;
1747       /* 5-term expansion (rely on compiler for CSE), simplified from:
1748 	        ispi / (x+0.5/(x+1/(x+1.5/(x+2/x))))  */
1749       return ispi*((x*x) * (x*x-4.5) + 2) / (x * ((x*x) * (x*x-5) + 3.75));
1750     }
1751     return -w_im_y100(100/(1-x), -x);
1752   }
1753 }
1754 
1755 /////////////////////////////////////////////////////////////////////////
1756 
1757 // Compile with -DTEST_FADDEEVA to compile a little test program
1758 #ifdef TEST_FADDEEVA
1759 
1760 #include <cstdio>
1761 
1762 // compute relative error |b-a|/|a|, handling case of NaN and Inf,
relerr(double a,double b)1763 static double relerr(double a, double b) {
1764   if (my_isnan(a) || my_isnan(b) || my_isinf(a) || my_isinf(b)) {
1765     if ((my_isnan(a) && !my_isnan(b)) || (!my_isnan(a) && my_isnan(b)) ||
1766 	(my_isinf(a) && !my_isinf(b)) || (!my_isinf(a) && my_isinf(b)) ||
1767 	(my_isinf(a) && my_isinf(b) && a*b < 0))
1768       return Inf; // "infinite" error
1769     return 0; // matching infinity/nan results counted as zero error
1770   }
1771   if (a == 0)
1772     return b == 0 ? 0 : Inf;
1773   else
1774     return fabs((b-a) / a);
1775 }
1776 
main(void)1777 int main(void) {
1778   double errmax_all = 0;
1779   {
1780     printf("############# w(z) tests #############\n");
1781     const int NTST = 57;
1782     complex<double> z[NTST] = {
1783       complex<double>(624.2,-0.26123),
1784       complex<double>(-0.4,3.),
1785       complex<double>(0.6,2.),
1786       complex<double>(-1.,1.),
1787       complex<double>(-1.,-9.),
1788       complex<double>(-1.,9.),
1789       complex<double>(-0.0000000234545,1.1234),
1790       complex<double>(-3.,5.1),
1791       complex<double>(-53,30.1),
1792       complex<double>(0.0,0.12345),
1793       complex<double>(11,1),
1794       complex<double>(-22,-2),
1795       complex<double>(9,-28),
1796       complex<double>(21,-33),
1797       complex<double>(1e5,1e5),
1798       complex<double>(1e14,1e14),
1799       complex<double>(-3001,-1000),
1800       complex<double>(1e160,-1e159),
1801       complex<double>(-6.01,0.01),
1802       complex<double>(-0.7,-0.7),
1803       complex<double>(2.611780000000000e+01, 4.540909610972489e+03),
1804       complex<double>(0.8e7,0.3e7),
1805       complex<double>(-20,-19.8081),
1806       complex<double>(1e-16,-1.1e-16),
1807       complex<double>(2.3e-8,1.3e-8),
1808       complex<double>(6.3,-1e-13),
1809       complex<double>(6.3,1e-20),
1810       complex<double>(1e-20,6.3),
1811       complex<double>(1e-20,16.3),
1812       complex<double>(9,1e-300),
1813       complex<double>(6.01,0.11),
1814       complex<double>(8.01,1.01e-10),
1815       complex<double>(28.01,1e-300),
1816       complex<double>(10.01,1e-200),
1817       complex<double>(10.01,-1e-200),
1818       complex<double>(10.01,0.99e-10),
1819       complex<double>(10.01,-0.99e-10),
1820       complex<double>(1e-20,7.01),
1821       complex<double>(-1,7.01),
1822       complex<double>(5.99,7.01),
1823       complex<double>(1,0),
1824       complex<double>(55,0),
1825       complex<double>(-0.1,0),
1826       complex<double>(1e-20,0),
1827       complex<double>(0,5e-14),
1828       complex<double>(0,51),
1829       complex<double>(Inf,0),
1830       complex<double>(-Inf,0),
1831       complex<double>(0,Inf),
1832       complex<double>(0,-Inf),
1833       complex<double>(Inf,Inf),
1834       complex<double>(Inf,-Inf),
1835       complex<double>(NaN,NaN),
1836       complex<double>(NaN,0),
1837       complex<double>(0,NaN),
1838       complex<double>(NaN,Inf),
1839       complex<double>(Inf,NaN)
1840     };
1841     complex<double> w[NTST] = { /* w(z), computed with WolframAlpha
1842 				   ... note that WolframAlpha is problematic
1843 				   some of the above inputs, so I had to
1844 				   use the continued-fraction expansion
1845 				   in WolframAlpha in some cases, or switch
1846 				   to Maple */
1847       complex<double>(-3.78270245518980507452677445620103199303131110e-7,
1848 		      0.000903861276433172057331093754199933411710053155),
1849       complex<double>(0.1764906227004816847297495349730234591778719532788,
1850 		      -0.02146550539468457616788719893991501311573031095617),
1851       complex<double>(0.2410250715772692146133539023007113781272362309451,
1852 		      0.06087579663428089745895459735240964093522265589350),
1853       complex<double>(0.30474420525691259245713884106959496013413834051768,
1854 		      -0.20821893820283162728743734725471561394145872072738),
1855       complex<double>(7.317131068972378096865595229600561710140617977e34,
1856 		      8.321873499714402777186848353320412813066170427e34),
1857       complex<double>(0.0615698507236323685519612934241429530190806818395,
1858 		      -0.00676005783716575013073036218018565206070072304635),
1859       complex<double>(0.3960793007699874918961319170187598400134746631,
1860 		      -5.593152259116644920546186222529802777409274656e-9),
1861       complex<double>(0.08217199226739447943295069917990417630675021771804,
1862 		      -0.04701291087643609891018366143118110965272615832184),
1863       complex<double>(0.00457246000350281640952328010227885008541748668738,
1864 		      -0.00804900791411691821818731763401840373998654987934),
1865       complex<double>(0.8746342859608052666092782112565360755791467973338452,
1866 		      0.),
1867       complex<double>(0.00468190164965444174367477874864366058339647648741,
1868 		      0.0510735563901306197993676329845149741675029197050),
1869       complex<double>(-0.0023193175200187620902125853834909543869428763219,
1870 		      -0.025460054739731556004902057663500272721780776336),
1871       complex<double>(9.11463368405637174660562096516414499772662584e304,
1872 		      3.97101807145263333769664875189354358563218932e305),
1873       complex<double>(-4.4927207857715598976165541011143706155432296e281,
1874 		      -2.8019591213423077494444700357168707775769028e281),
1875       complex<double>(2.820947917809305132678577516325951485807107151e-6,
1876 		      2.820947917668257736791638444590253942253354058e-6),
1877       complex<double>(2.82094791773878143474039725787438662716372268e-15,
1878 		      2.82094791773878143474039725773333923127678361e-15),
1879       complex<double>(-0.0000563851289696244350147899376081488003110150498,
1880 		      -0.000169211755126812174631861529808288295454992688),
1881       complex<double>(-5.586035480670854326218608431294778077663867e-162,
1882 		      5.586035480670854326218608431294778077663867e-161),
1883       complex<double>(0.00016318325137140451888255634399123461580248456,
1884 		      -0.095232456573009287370728788146686162555021209999),
1885       complex<double>(0.69504753678406939989115375989939096800793577783885,
1886 		      -1.8916411171103639136680830887017670616339912024317),
1887       complex<double>(0.0001242418269653279656612334210746733213167234822,
1888 		      7.145975826320186888508563111992099992116786763e-7),
1889       complex<double>(2.318587329648353318615800865959225429377529825e-8,
1890 		      6.182899545728857485721417893323317843200933380e-8),
1891       complex<double>(-0.0133426877243506022053521927604277115767311800303,
1892 		      -0.0148087097143220769493341484176979826888871576145),
1893       complex<double>(1.00000000000000012412170838050638522857747934,
1894 		      1.12837916709551279389615890312156495593616433e-16),
1895       complex<double>(0.9999999853310704677583504063775310832036830015,
1896 		      2.595272024519678881897196435157270184030360773e-8),
1897       complex<double>(-1.4731421795638279504242963027196663601154624e-15,
1898 		      0.090727659684127365236479098488823462473074709),
1899       complex<double>(5.79246077884410284575834156425396800754409308e-18,
1900 		      0.0907276596841273652364790985059772809093822374),
1901       complex<double>(0.0884658993528521953466533278764830881245144368,
1902 		      1.37088352495749125283269718778582613192166760e-22),
1903       complex<double>(0.0345480845419190424370085249304184266813447878,
1904 		      2.11161102895179044968099038990446187626075258e-23),
1905       complex<double>(6.63967719958073440070225527042829242391918213e-36,
1906 		      0.0630820900592582863713653132559743161572639353),
1907       complex<double>(0.00179435233208702644891092397579091030658500743634,
1908 		      0.0951983814805270647939647438459699953990788064762),
1909       complex<double>(9.09760377102097999924241322094863528771095448e-13,
1910 		      0.0709979210725138550986782242355007611074966717),
1911       complex<double>(7.2049510279742166460047102593255688682910274423e-304,
1912 		      0.0201552956479526953866611812593266285000876784321),
1913       complex<double>(3.04543604652250734193622967873276113872279682e-44,
1914 		    0.0566481651760675042930042117726713294607499165),
1915       complex<double>(3.04543604652250734193622967873276113872279682e-44,
1916 		      0.0566481651760675042930042117726713294607499165),
1917       complex<double>(0.5659928732065273429286988428080855057102069081e-12,
1918 		      0.056648165176067504292998527162143030538756683302),
1919       complex<double>(-0.56599287320652734292869884280802459698927645e-12,
1920 		      0.0566481651760675042929985271621430305387566833029),
1921       complex<double>(0.0796884251721652215687859778119964009569455462,
1922 		      1.11474461817561675017794941973556302717225126e-22),
1923       complex<double>(0.07817195821247357458545539935996687005781943386550,
1924 		      -0.01093913670103576690766705513142246633056714279654),
1925       complex<double>(0.04670032980990449912809326141164730850466208439937,
1926 		      0.03944038961933534137558064191650437353429669886545),
1927       complex<double>(0.36787944117144232159552377016146086744581113103176,
1928 		      0.60715770584139372911503823580074492116122092866515),
1929       complex<double>(0,
1930 		      0.010259688805536830986089913987516716056946786526145),
1931       complex<double>(0.99004983374916805357390597718003655777207908125383,
1932 		      -0.11208866436449538036721343053869621153527769495574),
1933       complex<double>(0.99999999999999999999999999999999999999990000,
1934 		      1.12837916709551257389615890312154517168802603e-20),
1935       complex<double>(0.999999999999943581041645226871305192054749891144158,
1936 		      0),
1937       complex<double>(0.0110604154853277201542582159216317923453996211744250,
1938 		      0),
1939       complex<double>(0,0),
1940       complex<double>(0,0),
1941       complex<double>(0,0),
1942       complex<double>(Inf,0),
1943       complex<double>(0,0),
1944       complex<double>(NaN,NaN),
1945       complex<double>(NaN,NaN),
1946       complex<double>(NaN,NaN),
1947       complex<double>(NaN,0),
1948       complex<double>(NaN,NaN),
1949       complex<double>(NaN,NaN)
1950     };
1951     double errmax = 0;
1952     for (int i = 0; i < NTST; ++i) {
1953       complex<double> fw = Faddeeva::w(z[i],0.);
1954       double re_err = relerr(real(w[i]), real(fw));
1955       double im_err = relerr(imag(w[i]), imag(fw));
1956       printf("w(%g%+gi) = %g%+gi (vs. %g%+gi), re/im rel. err. = %0.2g/%0.2g)\n",
1957 	     real(z[i]),imag(z[i]), real(fw),imag(fw), real(w[i]),imag(w[i]),
1958 	     re_err, im_err);
1959       if (re_err > errmax) errmax = re_err;
1960       if (im_err > errmax) errmax = im_err;
1961     }
1962     if (errmax > 1e-13) {
1963       printf("FAILURE -- relative error %g too large!\n", errmax);
1964       return 1;
1965     }
1966     printf("SUCCESS (max relative error = %g)\n", errmax);
1967     if (errmax > errmax_all) errmax_all = errmax;
1968   }
1969   {
1970     const int NTST = 33;
1971     complex<double> z[NTST] = {
1972       complex<double>(1,2),
1973       complex<double>(-1,2),
1974       complex<double>(1,-2),
1975       complex<double>(-1,-2),
1976       complex<double>(9,-28),
1977       complex<double>(21,-33),
1978       complex<double>(1e3,1e3),
1979       complex<double>(-3001,-1000),
1980       complex<double>(1e160,-1e159),
1981       complex<double>(5.1e-3, 1e-8),
1982       complex<double>(-4.9e-3, 4.95e-3),
1983       complex<double>(4.9e-3, 0.5),
1984       complex<double>(4.9e-4, -0.5e1),
1985       complex<double>(-4.9e-5, -0.5e2),
1986       complex<double>(5.1e-3, 0.5),
1987       complex<double>(5.1e-4, -0.5e1),
1988       complex<double>(-5.1e-5, -0.5e2),
1989       complex<double>(1e-6,2e-6),
1990       complex<double>(0,2e-6),
1991       complex<double>(0,2),
1992       complex<double>(0,20),
1993       complex<double>(0,200),
1994       complex<double>(Inf,0),
1995       complex<double>(-Inf,0),
1996       complex<double>(0,Inf),
1997       complex<double>(0,-Inf),
1998       complex<double>(Inf,Inf),
1999       complex<double>(Inf,-Inf),
2000       complex<double>(NaN,NaN),
2001       complex<double>(NaN,0),
2002       complex<double>(0,NaN),
2003       complex<double>(NaN,Inf),
2004       complex<double>(Inf,NaN)
2005     };
2006     complex<double> w[NTST] = { // erf(z[i]), evaluated with Maple
2007       complex<double>(-0.5366435657785650339917955593141927494421,
2008 		      -5.049143703447034669543036958614140565553),
2009       complex<double>(0.5366435657785650339917955593141927494421,
2010 		      -5.049143703447034669543036958614140565553),
2011       complex<double>(-0.5366435657785650339917955593141927494421,
2012 		      5.049143703447034669543036958614140565553),
2013       complex<double>(0.5366435657785650339917955593141927494421,
2014 		      5.049143703447034669543036958614140565553),
2015       complex<double>(0.3359473673830576996788000505817956637777e304,
2016 		      -0.1999896139679880888755589794455069208455e304),
2017       complex<double>(0.3584459971462946066523939204836760283645e278,
2018 		      0.3818954885257184373734213077678011282505e280),
2019       complex<double>(0.9996020422657148639102150147542224526887,
2020 		      0.00002801044116908227889681753993542916894856),
2021       complex<double>(-1, 0),
2022       complex<double>(1, 0),
2023       complex<double>(0.005754683859034800134412990541076554934877,
2024 		      0.1128349818335058741511924929801267822634e-7),
2025       complex<double>(-0.005529149142341821193633460286828381876955,
2026 		      0.005585388387864706679609092447916333443570),
2027       complex<double>(0.007099365669981359632319829148438283865814,
2028 		      0.6149347012854211635026981277569074001219),
2029       complex<double>(0.3981176338702323417718189922039863062440e8,
2030 		      -0.8298176341665249121085423917575122140650e10),
2031       complex<double>(-Inf,
2032 		      -Inf),
2033       complex<double>(0.007389128308257135427153919483147229573895,
2034 		      0.6149332524601658796226417164791221815139),
2035       complex<double>(0.4143671923267934479245651547534414976991e8,
2036 		      -0.8298168216818314211557046346850921446950e10),
2037       complex<double>(-Inf,
2038 		      -Inf),
2039       complex<double>(0.1128379167099649964175513742247082845155e-5,
2040 		      0.2256758334191777400570377193451519478895e-5),
2041       complex<double>(0,
2042 		      0.2256758334194034158904576117253481476197e-5),
2043       complex<double>(0,
2044 		      18.56480241457555259870429191324101719886),
2045       complex<double>(0,
2046 		      0.1474797539628786202447733153131835124599e173),
2047       complex<double>(0,
2048 		      Inf),
2049       complex<double>(1,0),
2050       complex<double>(-1,0),
2051       complex<double>(0,Inf),
2052       complex<double>(0,-Inf),
2053       complex<double>(NaN,NaN),
2054       complex<double>(NaN,NaN),
2055       complex<double>(NaN,NaN),
2056       complex<double>(NaN,0),
2057       complex<double>(0,NaN),
2058       complex<double>(NaN,NaN),
2059       complex<double>(NaN,NaN)
2060     };
2061 #define TST(f)								\
2062     printf("############# " #f "(z) tests #############\n");		\
2063     double errmax = 0;							\
2064     for (int i = 0; i < NTST; ++i) {					\
2065       complex<double> fw = Faddeeva::f(z[i],0.);			\
2066       double re_err = relerr(real(w[i]), real(fw));			\
2067       double im_err = relerr(imag(w[i]), imag(fw));			\
2068       printf(#f "(%g%+gi) = %g%+gi (vs. %g%+gi), re/im rel. err. = %0.2g/%0.2g)\n", \
2069 	     real(z[i]),imag(z[i]), real(fw),imag(fw), real(w[i]),imag(w[i]), \
2070 	     re_err, im_err);						\
2071       if (re_err > errmax) errmax = re_err;				\
2072       if (im_err > errmax) errmax = im_err;				\
2073     }									\
2074     if (errmax > 1e-13) {						\
2075       printf("FAILURE -- relative error %g too large!\n", errmax);	\
2076       return 1;								\
2077     }									\
2078     printf("Checking " #f "(x) special case...\n");			\
2079     for (int i = 0; i < 10000; ++i) {					\
2080       double x = pow(10., -300. + i * 600. / (10000 - 1));		\
2081       double re_err = relerr(Faddeeva::f(x),				\
2082 			     real(Faddeeva::f(complex<double>(x,0.))));	\
2083       if (re_err > errmax) errmax = re_err;				\
2084       re_err = relerr(Faddeeva::f(-x),					\
2085 		      real(Faddeeva::f(complex<double>(-x,0.))));	\
2086       if (re_err > errmax) errmax = re_err;				\
2087     }									\
2088     {									\
2089       double re_err = relerr(Faddeeva::f(Inf),				\
2090 			     real(Faddeeva::f(complex<double>(Inf,0.)))); \
2091       if (re_err > errmax) errmax = re_err;				\
2092       re_err = relerr(Faddeeva::f(-Inf),				\
2093 		      real(Faddeeva::f(complex<double>(-Inf,0.))));	\
2094       if (re_err > errmax) errmax = re_err;				\
2095       re_err = relerr(Faddeeva::f(NaN),					\
2096 		      real(Faddeeva::f(complex<double>(NaN,0.))));	\
2097       if (re_err > errmax) errmax = re_err;				\
2098     }									\
2099     if (errmax > 1e-13) {						\
2100       printf("FAILURE -- relative error %g too large!\n", errmax);	\
2101       return 1;								\
2102     }									\
2103     printf("SUCCESS (max relative error = %g)\n", errmax);		\
2104     if (errmax > errmax_all) errmax_all = errmax
2105 
2106     TST(erf);
2107   }
2108   {
2109     // since erfi just calls through to erf, just one test should
2110     // be sufficient to make sure I didn't screw up the signs or something
2111     const int NTST = 1;
2112     complex<double> z[NTST] = { complex<double>(1.234,0.5678) };
2113     complex<double> w[NTST] = { // erfi(z[i]), computed with Maple
2114       complex<double>(1.081032284405373149432716643834106923212,
2115 		      1.926775520840916645838949402886591180834)
2116     };
2117     TST(erfi);
2118   }
2119   {
2120     // since erfcx just calls through to w, just one test should
2121     // be sufficient to make sure I didn't screw up the signs or something
2122     const int NTST = 1;
2123     complex<double> z[NTST] = { complex<double>(1.234,0.5678) };
2124     complex<double> w[NTST] = { // erfcx(z[i]), computed with Maple
2125       complex<double>(0.3382187479799972294747793561190487832579,
2126 		      -0.1116077470811648467464927471872945833154)
2127     };
2128     TST(erfcx);
2129   }
2130   {
2131     const int NTST = 30;
2132     complex<double> z[NTST] = {
2133       complex<double>(1,2),
2134       complex<double>(-1,2),
2135       complex<double>(1,-2),
2136       complex<double>(-1,-2),
2137       complex<double>(9,-28),
2138       complex<double>(21,-33),
2139       complex<double>(1e3,1e3),
2140       complex<double>(-3001,-1000),
2141       complex<double>(1e160,-1e159),
2142       complex<double>(5.1e-3, 1e-8),
2143       complex<double>(0,2e-6),
2144       complex<double>(0,2),
2145       complex<double>(0,20),
2146       complex<double>(0,200),
2147       complex<double>(2e-6,0),
2148       complex<double>(2,0),
2149       complex<double>(20,0),
2150       complex<double>(200,0),
2151       complex<double>(Inf,0),
2152       complex<double>(-Inf,0),
2153       complex<double>(0,Inf),
2154       complex<double>(0,-Inf),
2155       complex<double>(Inf,Inf),
2156       complex<double>(Inf,-Inf),
2157       complex<double>(NaN,NaN),
2158       complex<double>(NaN,0),
2159       complex<double>(0,NaN),
2160       complex<double>(NaN,Inf),
2161       complex<double>(Inf,NaN),
2162       complex<double>(88,0)
2163     };
2164     complex<double> w[NTST] = { // erfc(z[i]), evaluated with Maple
2165       complex<double>(1.536643565778565033991795559314192749442,
2166 		      5.049143703447034669543036958614140565553),
2167       complex<double>(0.4633564342214349660082044406858072505579,
2168 		      5.049143703447034669543036958614140565553),
2169       complex<double>(1.536643565778565033991795559314192749442,
2170 		      -5.049143703447034669543036958614140565553),
2171       complex<double>(0.4633564342214349660082044406858072505579,
2172 		      -5.049143703447034669543036958614140565553),
2173       complex<double>(-0.3359473673830576996788000505817956637777e304,
2174 		      0.1999896139679880888755589794455069208455e304),
2175       complex<double>(-0.3584459971462946066523939204836760283645e278,
2176 		      -0.3818954885257184373734213077678011282505e280),
2177       complex<double>(0.0003979577342851360897849852457775473112748,
2178 		      -0.00002801044116908227889681753993542916894856),
2179       complex<double>(2, 0),
2180       complex<double>(0, 0),
2181       complex<double>(0.9942453161409651998655870094589234450651,
2182 		      -0.1128349818335058741511924929801267822634e-7),
2183       complex<double>(1,
2184 		      -0.2256758334194034158904576117253481476197e-5),
2185       complex<double>(1,
2186 		      -18.56480241457555259870429191324101719886),
2187       complex<double>(1,
2188 		      -0.1474797539628786202447733153131835124599e173),
2189       complex<double>(1, -Inf),
2190       complex<double>(0.9999977432416658119838633199332831406314,
2191 		      0),
2192       complex<double>(0.004677734981047265837930743632747071389108,
2193 		      0),
2194       complex<double>(0.5395865611607900928934999167905345604088e-175,
2195 		      0),
2196       complex<double>(0, 0),
2197       complex<double>(0, 0),
2198       complex<double>(2, 0),
2199       complex<double>(1, -Inf),
2200       complex<double>(1, Inf),
2201       complex<double>(NaN, NaN),
2202       complex<double>(NaN, NaN),
2203       complex<double>(NaN, NaN),
2204       complex<double>(NaN, 0),
2205       complex<double>(1, NaN),
2206       complex<double>(NaN, NaN),
2207       complex<double>(NaN, NaN),
2208       complex<double>(0,0)
2209     };
2210     TST(erfc);
2211   }
2212   {
2213     const int NTST = 47;
2214     complex<double> z[NTST] = {
2215       complex<double>(2,1),
2216       complex<double>(-2,1),
2217       complex<double>(2,-1),
2218       complex<double>(-2,-1),
2219       complex<double>(-28,9),
2220       complex<double>(33,-21),
2221       complex<double>(1e3,1e3),
2222       complex<double>(-1000,-3001),
2223       complex<double>(1e-8, 5.1e-3),
2224       complex<double>(4.95e-3, -4.9e-3),
2225       complex<double>(0.5, 4.9e-3),
2226       complex<double>(-0.5e1, 4.9e-4),
2227       complex<double>(-0.5e2, -4.9e-5),
2228       complex<double>(0.5e3, 4.9e-6),
2229       complex<double>(0.5, 5.1e-3),
2230       complex<double>(-0.5e1, 5.1e-4),
2231       complex<double>(-0.5e2, -5.1e-5),
2232       complex<double>(1e-6,2e-6),
2233       complex<double>(2e-6,0),
2234       complex<double>(2,0),
2235       complex<double>(20,0),
2236       complex<double>(200,0),
2237       complex<double>(0,4.9e-3),
2238       complex<double>(0,-5.1e-3),
2239       complex<double>(0,2e-6),
2240       complex<double>(0,-2),
2241       complex<double>(0,20),
2242       complex<double>(0,-200),
2243       complex<double>(Inf,0),
2244       complex<double>(-Inf,0),
2245       complex<double>(0,Inf),
2246       complex<double>(0,-Inf),
2247       complex<double>(Inf,Inf),
2248       complex<double>(Inf,-Inf),
2249       complex<double>(NaN,NaN),
2250       complex<double>(NaN,0),
2251       complex<double>(0,NaN),
2252       complex<double>(NaN,Inf),
2253       complex<double>(Inf,NaN),
2254       complex<double>(39, 6.4e-5),
2255       complex<double>(41, 6.09e-5),
2256       complex<double>(4.9e7, 5e-11),
2257       complex<double>(5.1e7, 4.8e-11),
2258       complex<double>(1e9, 2.4e-12),
2259       complex<double>(1e11, 2.4e-14),
2260       complex<double>(1e13, 2.4e-16),
2261       complex<double>(1e300, 2.4e-303)
2262     };
2263     complex<double> w[NTST] = { // dawson(z[i]), evaluated with Maple
2264       complex<double>(0.1635394094345355614904345232875688576839,
2265 		      -0.1531245755371229803585918112683241066853),
2266       complex<double>(-0.1635394094345355614904345232875688576839,
2267 		      -0.1531245755371229803585918112683241066853),
2268       complex<double>(0.1635394094345355614904345232875688576839,
2269 		      0.1531245755371229803585918112683241066853),
2270       complex<double>(-0.1635394094345355614904345232875688576839,
2271 		      0.1531245755371229803585918112683241066853),
2272       complex<double>(-0.01619082256681596362895875232699626384420,
2273 		      -0.005210224203359059109181555401330902819419),
2274       complex<double>(0.01078377080978103125464543240346760257008,
2275 		      0.006866888783433775382193630944275682670599),
2276       complex<double>(-0.5808616819196736225612296471081337245459,
2277 		      0.6688593905505562263387760667171706325749),
2278       complex<double>(Inf,
2279 		      -Inf),
2280       complex<double>(0.1000052020902036118082966385855563526705e-7,
2281 		      0.005100088434920073153418834680320146441685),
2282       complex<double>(0.004950156837581592745389973960217444687524,
2283 		      -0.004899838305155226382584756154100963570500),
2284       complex<double>(0.4244534840871830045021143490355372016428,
2285 		      0.002820278933186814021399602648373095266538),
2286       complex<double>(-0.1021340733271046543881236523269967674156,
2287 		      -0.00001045696456072005761498961861088944159916),
2288       complex<double>(-0.01000200120119206748855061636187197886859,
2289 		      0.9805885888237419500266621041508714123763e-8),
2290       complex<double>(0.001000002000012000023960527532953151819595,
2291 		      -0.9800058800588007290937355024646722133204e-11),
2292       complex<double>(0.4244549085628511778373438768121222815752,
2293 		      0.002935393851311701428647152230552122898291),
2294       complex<double>(-0.1021340732357117208743299813648493928105,
2295 		      -0.00001088377943049851799938998805451564893540),
2296       complex<double>(-0.01000200120119126652710792390331206563616,
2297 		      0.1020612612857282306892368985525393707486e-7),
2298       complex<double>(0.1000000000007333333333344266666666664457e-5,
2299 		      0.2000000000001333333333323199999999978819e-5),
2300       complex<double>(0.1999999999994666666666675199999999990248e-5,
2301 		      0),
2302       complex<double>(0.3013403889237919660346644392864226952119,
2303 		      0),
2304       complex<double>(0.02503136792640367194699495234782353186858,
2305 		      0),
2306       complex<double>(0.002500031251171948248596912483183760683918,
2307 		      0),
2308       complex<double>(0,0.004900078433419939164774792850907128053308),
2309       complex<double>(0,-0.005100088434920074173454208832365950009419),
2310       complex<double>(0,0.2000000000005333333333341866666666676419e-5),
2311       complex<double>(0,-48.16001211429122974789822893525016528191),
2312       complex<double>(0,0.4627407029504443513654142715903005954668e174),
2313       complex<double>(0,-Inf),
2314       complex<double>(0,0),
2315       complex<double>(-0,0),
2316       complex<double>(0, Inf),
2317       complex<double>(0, -Inf),
2318       complex<double>(NaN, NaN),
2319       complex<double>(NaN, NaN),
2320       complex<double>(NaN, NaN),
2321       complex<double>(NaN, 0),
2322       complex<double>(0, NaN),
2323       complex<double>(NaN, NaN),
2324       complex<double>(NaN, NaN),
2325       complex<double>(0.01282473148489433743567240624939698290584,
2326 		      -0.2105957276516618621447832572909153498104e-7),
2327       complex<double>(0.01219875253423634378984109995893708152885,
2328 		      -0.1813040560401824664088425926165834355953e-7),
2329       complex<double>(0.1020408163265306334945473399689037886997e-7,
2330 		      -0.1041232819658476285651490827866174985330e-25),
2331       complex<double>(0.9803921568627452865036825956835185367356e-8,
2332 		      -0.9227220299884665067601095648451913375754e-26),
2333       complex<double>(0.5000000000000000002500000000000000003750e-9,
2334 		      -0.1200000000000000001800000188712838420241e-29),
2335       complex<double>(5.00000000000000000000025000000000000000000003e-12,
2336 		      -1.20000000000000000000018000000000000000000004e-36),
2337       complex<double>(5.00000000000000000000000002500000000000000000e-14,
2338 		      -1.20000000000000000000000001800000000000000000e-42),
2339       complex<double>(5e-301, 0)
2340     };
2341     TST(Dawson);
2342   }
2343   printf("#####################################\n");
2344   printf("SUCCESS (max relative error = %g)\n", errmax_all);
2345 }
2346 
2347 #endif
2348