GNU Octave  3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Faddeeva.cc
Go to the documentation of this file.
1 // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; -*-
2 
3 /* Copyright (c) 2012 Massachusetts Institute of Technology
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 /* (Note that this file can be compiled with either C++, in which
26  case it uses C++ std::complex<double>, or C, in which case it
27  uses C99 double complex.) */
28 
29 /* Available at: http://ab-initio.mit.edu/Faddeeva
30 
31  Computes various error functions (erf, erfc, erfi, erfcx),
32  including the Dawson integral, in the complex plane, based
33  on algorithms for the computation of the Faddeeva function
34  w(z) = exp(-z^2) * erfc(-i*z).
35  Given w(z), the error functions are mostly straightforward
36  to compute, except for certain regions where we have to
37  switch to Taylor expansions to avoid cancellation errors
38  [e.g. near the origin for erf(z)].
39 
40  To compute the Faddeeva function, we use a combination of two
41  algorithms:
42 
43  For sufficiently large |z|, we use a continued-fraction expansion
44  for w(z) similar to those described in:
45 
46  Walter Gautschi, "Efficient computation of the complex error
47  function," SIAM J. Numer. Anal. 7(1), pp. 187-198 (1970)
48 
49  G. P. M. Poppe and C. M. J. Wijers, "More efficient computation
50  of the complex error function," ACM Trans. Math. Soft. 16(1),
51  pp. 38-46 (1990).
52 
53  Unlike those papers, however, we switch to a completely different
54  algorithm for smaller |z|:
55 
56  Mofreh R. Zaghloul and Ahmed N. Ali, "Algorithm 916: Computing the
57  Faddeyeva and Voigt Functions," ACM Trans. Math. Soft. 38(2), 15
58  (2011).
59 
60  (I initially used this algorithm for all z, but it turned out to be
61  significantly slower than the continued-fraction expansion for
62  larger |z|. On the other hand, it is competitive for smaller |z|,
63  and is significantly more accurate than the Poppe & Wijers code
64  in some regions, e.g. in the vicinity of z=1+1i.)
65 
66  Note that this is an INDEPENDENT RE-IMPLEMENTATION of these algorithms,
67  based on the description in the papers ONLY. In particular, I did
68  not refer to the authors' Fortran or Matlab implementations, respectively,
69  (which are under restrictive ACM copyright terms and therefore unusable
70  in free/open-source software).
71 
72  Steven G. Johnson, Massachusetts Institute of Technology
73  http://math.mit.edu/~stevenj
74  October 2012.
75 
76  -- Note that Algorithm 916 assumes that the erfc(x) function,
77  or rather the scaled function erfcx(x) = exp(x*x)*erfc(x),
78  is supplied for REAL arguments x. I originally used an
79  erfcx routine derived from DERFC in SLATEC, but I have
80  since replaced it with a much faster routine written by
81  me which uses a combination of continued-fraction expansions
82  and a lookup table of Chebyshev polynomials. For speed,
83  I implemented a similar algorithm for Im[w(x)] of real x,
84  since this comes up frequently in the other error functions.
85 
86  A small test program is included the end, which checks
87  the w(z) etc. results against several known values. To compile
88  the test function, compile with -DTEST_FADDEEVA (that is,
89  #define TEST_FADDEEVA).
90 
91  If HAVE_CONFIG_H is #defined (e.g. by compiling with -DHAVE_CONFIG_H),
92  then we #include "config.h", which is assumed to be a GNU autoconf-style
93  header defining HAVE_* macros to indicate the presence of features. In
94  particular, if HAVE_ISNAN and HAVE_ISINF are #defined, we use those
95  functions in math.h instead of defining our own, and if HAVE_ERF and/or
96  HAVE_ERFC are defined we use those functions from <cmath> for erf and
97  erfc of real arguments, respectively, instead of defining our own.
98 
99  REVISION HISTORY:
100  4 October 2012: Initial public release (SGJ)
101  5 October 2012: Revised (SGJ) to fix spelling error,
102  start summation for large x at round(x/a) (> 1)
103  rather than ceil(x/a) as in the original
104  paper, which should slightly improve performance
105  (and, apparently, slightly improves accuracy)
106  19 October 2012: Revised (SGJ) to fix bugs for large x, large -y,
107  and 15<x<26. Performance improvements. Prototype
108  now supplies default value for relerr.
109  24 October 2012: Switch to continued-fraction expansion for
110  sufficiently large z, for performance reasons.
111  Also, avoid spurious overflow for |z| > 1e154.
112  Set relerr argument to min(relerr,0.1).
113  27 October 2012: Enhance accuracy in Re[w(z)] taken by itself,
114  by switching to Alg. 916 in a region near
115  the real-z axis where continued fractions
116  have poor relative accuracy in Re[w(z)]. Thanks
117  to M. Zaghloul for the tip.
118  29 October 2012: Replace SLATEC-derived erfcx routine with
119  completely rewritten code by me, using a very
120  different algorithm which is much faster.
121  30 October 2012: Implemented special-case code for real z
122  (where real part is exp(-x^2) and imag part is
123  Dawson integral), using algorithm similar to erfx.
124  Export ImFaddeeva_w function to make Dawson's
125  integral directly accessible.
126  3 November 2012: Provide implementations of erf, erfc, erfcx,
127  and Dawson functions in Faddeeva:: namespace,
128  in addition to Faddeeva::w. Provide header
129  file Faddeeva.hh.
130  4 November 2012: Slightly faster erf for real arguments.
131  Updated MATLAB and Octave plugins.
132  27 November 2012: Support compilation with either C++ or
133  plain C (using C99 complex numbers).
134  For real x, use standard-library erf(x)
135  and erfc(x) if available (for C99 or C++11).
136  #include "config.h" if HAVE_CONFIG_H is #defined.
137  15 December 2012: Portability fixes (copysign, Inf/NaN creation),
138  use CMPLX/__builtin_complex if available in C,
139  slight accuracy improvements to erf and dawson
140  functions near the origin. Use gnulib functions
141  if GNULIB_NAMESPACE is defined.
142 */
143 
144 /////////////////////////////////////////////////////////////////////////
145 /* If this file is compiled as a part of a larger project,
146  support using an autoconf-style config.h header file
147  (with various "HAVE_*" #defines to indicate features)
148  if HAVE_CONFIG_H is #defined (in GNU autotools style). */
149 
150 #ifdef HAVE_CONFIG_H
151 # include "config.h"
152 #endif
153 
154 /////////////////////////////////////////////////////////////////////////
155 // macros to allow us to use either C++ or C (with C99 features)
156 
157 #ifdef __cplusplus
158 
159 # include "Faddeeva.hh"
160 
161 # include <cfloat>
162 # include <cmath>
163 # include <limits>
164 using namespace std;
165 
166 // use std::numeric_limits, since 1./0. and 0./0. fail with some compilers (MS)
167 # define Inf numeric_limits<double>::infinity()
168 # define NaN numeric_limits<double>::quiet_NaN()
169 
170 typedef complex<double> cmplx;
171 
172 // Use C-like complex syntax, since the C syntax is more restrictive
173 # define cexp(z) exp(z)
174 # define creal(z) real(z)
175 # define cimag(z) imag(z)
176 # define cpolar(r,t) polar(r,t)
177 
178 # define C(a,b) cmplx(a,b)
179 
180 # define FADDEEVA(name) Faddeeva::name
181 # define FADDEEVA_RE(name) Faddeeva::name
182 
183 // isnan/isinf were introduced in C++11
184 # if (__cplusplus < 201103L) && (!defined(HAVE_ISNAN) || !defined(HAVE_ISINF))
185 static inline bool my_isnan(double x) { return x != x; }
186 # define isnan my_isnan
187 static inline bool my_isinf(double x) { return 1/x == 0.; }
188 # define isinf my_isinf
189 # elif (__cplusplus >= 201103L)
190 // g++ gets confused between the C and C++ isnan/isinf functions
191 # define isnan std::isnan
192 # define isinf std::isinf
193 # endif
194 
195 // copysign was introduced in C++11 (and is also in POSIX and C99)
196 # if defined(_WIN32) || defined(__WIN32__)
197 # define copysign _copysign // of course MS had to be different
198 # elif defined(GNULIB_NAMESPACE) // we are using using gnulib <cmath>
199 # define copysign GNULIB_NAMESPACE::copysign
200 # elif (__cplusplus < 201103L) && !defined(HAVE_COPYSIGN) && !defined(__linux__) && !(defined(__APPLE__) && defined(__MACH__)) && !defined(_AIX)
201 static inline double my_copysign(double x, double y) { return y<0 ? -x : x; }
202 # define copysign my_copysign
203 # endif
204 
205 // If we are using the gnulib <cmath> (e.g. in the GNU Octave sources),
206 // gnulib generates a link warning if we use ::floor instead of gnulib::floor.
207 // This warning is completely innocuous because the only difference between
208 // gnulib::floor and the system ::floor (and only on ancient OSF systems)
209 // has to do with floor(-0), which doesn't occur in the usage below, but
210 // the Octave developers prefer that we silence the warning.
211 # ifdef GNULIB_NAMESPACE
212 # define floor GNULIB_NAMESPACE::floor
213 # endif
214 
215 #else // !__cplusplus, i.e. pure C (requires C99 features)
216 
217 # include "Faddeeva.h"
218 
219 # define _GNU_SOURCE // enable GNU libc NAN extension if possible
220 
221 # include <float.h>
222 # include <math.h>
223 
224 typedef double complex cmplx;
225 
226 # define FADDEEVA(name) Faddeeva_ ## name
227 # define FADDEEVA_RE(name) Faddeeva_ ## name ## _re
228 
229 /* Constructing complex numbers like 0+i*NaN is problematic in C99
230  without the C11 CMPLX macro, because 0.+I*NAN may give NaN+i*NAN if
231  I is a complex (rather than imaginary) constant. For some reason,
232  however, it works fine in (pre-4.7) gcc if I define Inf and NaN as
233  1/0 and 0/0 (and only if I compile with optimization -O1 or more),
234  but not if I use the INFINITY or NAN macros. */
235 
236 /* __builtin_complex was introduced in gcc 4.7, but the C11 CMPLX macro
237  may not be defined unless we are using a recent (2012) version of
238  glibc and compile with -std=c11... note that icc lies about being
239  gcc and probably doesn't have this builtin(?), so exclude icc explicitly */
240 # if !defined(CMPLX) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !(defined(__ICC) || defined(__INTEL_COMPILER))
241 # define CMPLX(a,b) __builtin_complex((double) (a), (double) (b))
242 # endif
243 
244 # ifdef CMPLX // C11
245 # define C(a,b) CMPLX(a,b)
246 # define Inf INFINITY // C99 infinity
247 # ifdef NAN // GNU libc extension
248 # define NaN NAN
249 # else
250 # define NaN (0./0.) // NaN
251 # endif
252 # else
253 # define C(a,b) ((a) + I*(b))
254 # define Inf (1./0.)
255 # define NaN (0./0.)
256 # endif
257 
258 static inline cmplx cpolar(double r, double t)
259 {
260  if (r == 0.0 && !isnan(t))
261  return 0.0;
262  else
263  return C(r * cos(t), r * sin(t));
264 }
265 
266 #endif // !__cplusplus, i.e. pure C (requires C99 features)
267 
268 /////////////////////////////////////////////////////////////////////////
269 // Auxiliary routines to compute other special functions based on w(z)
270 
271 // compute erfcx(z) = exp(z^2) erfz(z)
272 cmplx FADDEEVA(erfcx)(cmplx z, double relerr)
273 {
274  return FADDEEVA(w)(C(-cimag(z), creal(z)), relerr);
275 }
276 
277 // compute the error function erf(x)
278 double FADDEEVA_RE(erf)(double x)
279 {
280 #if !defined(__cplusplus)
281  return erf(x); // C99 supplies erf in math.h
282 #elif (__cplusplus >= 201103L) || defined(HAVE_ERF)
283  return ::erf(x); // C++11 supplies std::erf in cmath
284 #else
285  double mx2 = -x*x;
286  if (mx2 < -750) // underflow
287  return (x >= 0 ? 1.0 : -1.0);
288 
289  if (x >= 0) {
290  if (x < 8e-2) goto taylor;
291  return 1.0 - exp(mx2) * FADDEEVA_RE(erfcx)(x);
292  }
293  else { // x < 0
294  if (x > -8e-2) goto taylor;
295  return exp(mx2) * FADDEEVA_RE(erfcx)(-x) - 1.0;
296  }
297 
298  // Use Taylor series for small |x|, to avoid cancellation inaccuracy
299  // erf(x) = 2/sqrt(pi) * x * (1 - x^2/3 + x^4/10 - x^6/42 + x^8/216 + ...)
300  taylor:
301  return x * (1.1283791670955125739
302  + mx2 * (0.37612638903183752464
303  + mx2 * (0.11283791670955125739
304  + mx2 * (0.026866170645131251760
305  + mx2 * 0.0052239776254421878422))));
306 #endif
307 }
308 
309 // compute the error function erf(z)
310 cmplx FADDEEVA(erf)(cmplx z, double relerr)
311 {
312  double x = creal(z), y = cimag(z);
313 
314  if (y == 0)
315  return C(FADDEEVA_RE(erf)(x),
316  y); // preserve sign of 0
317  if (x == 0) // handle separately for speed & handling of y = Inf or NaN
318  return C(x, // preserve sign of 0
319  /* handle y -> Inf limit manually, since
320  exp(y^2) -> Inf but Im[w(y)] -> 0, so
321  IEEE will give us a NaN when it should be Inf */
322  y*y > 720 ? (y > 0 ? Inf : -Inf)
323  : exp(y*y) * FADDEEVA(w_im)(y));
324 
325  double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
326  double mIm_z2 = -2*x*y; // Im(-z^2)
327  if (mRe_z2 < -750) // underflow
328  return (x >= 0 ? 1.0 : -1.0);
329 
330  /* Handle positive and negative x via different formulas,
331  using the mirror symmetries of w, to avoid overflow/underflow
332  problems from multiplying exponentially large and small quantities. */
333  if (x >= 0) {
334  if (x < 8e-2) {
335  if (fabs(y) < 1e-2)
336  goto taylor;
337  else if (fabs(mIm_z2) < 5e-3 && x < 5e-3)
338  goto taylor_erfi;
339  }
340  /* don't use complex exp function, since that will produce spurious NaN
341  values when multiplying w in an overflow situation. */
342  return 1.0 - exp(mRe_z2) *
343  (C(cos(mIm_z2), sin(mIm_z2))
344  * FADDEEVA(w)(C(-y,x), relerr));
345  }
346  else { // x < 0
347  if (x > -8e-2) { // duplicate from above to avoid fabs(x) call
348  if (fabs(y) < 1e-2)
349  goto taylor;
350  else if (fabs(mIm_z2) < 5e-3 && x > -5e-3)
351  goto taylor_erfi;
352  }
353  else if (isnan(x))
354  return C(NaN, y == 0 ? 0 : NaN);
355  /* don't use complex exp function, since that will produce spurious NaN
356  values when multiplying w in an overflow situation. */
357  return exp(mRe_z2) *
358  (C(cos(mIm_z2), sin(mIm_z2))
359  * FADDEEVA(w)(C(y,-x), relerr)) - 1.0;
360  }
361 
362  // Use Taylor series for small |z|, to avoid cancellation inaccuracy
363  // erf(z) = 2/sqrt(pi) * z * (1 - z^2/3 + z^4/10 - z^6/42 + z^8/216 + ...)
364  taylor:
365  {
366  cmplx mz2 = C(mRe_z2, mIm_z2); // -z^2
367  return z * (1.1283791670955125739
368  + mz2 * (0.37612638903183752464
369  + mz2 * (0.11283791670955125739
370  + mz2 * (0.026866170645131251760
371  + mz2 * 0.0052239776254421878422))));
372  }
373 
374  /* for small |x| and small |xy|,
375  use Taylor series to avoid cancellation inaccuracy:
376  erf(x+iy) = erf(iy)
377  + 2*exp(y^2)/sqrt(pi) *
378  [ x * (1 - x^2 * (1+2y^2)/3 + x^4 * (3+12y^2+4y^4)/30 + ...
379  - i * x^2 * y * (1 - x^2 * (3+2y^2)/6 + ...) ]
380  where:
381  erf(iy) = exp(y^2) * Im[w(y)]
382  */
383  taylor_erfi:
384  {
385  double x2 = x*x, y2 = y*y;
386  double expy2 = exp(y2);
387  return C
388  (expy2 * x * (1.1283791670955125739
389  - x2 * (0.37612638903183752464
390  + 0.75225277806367504925*y2)
391  + x2*x2 * (0.11283791670955125739
392  + y2 * (0.45135166683820502956
393  + 0.15045055561273500986*y2))),
394  expy2 * (FADDEEVA(w_im)(y)
395  - x2*y * (1.1283791670955125739
396  - x2 * (0.56418958354775628695
397  + 0.37612638903183752464*y2))));
398  }
399 }
400 
401 // erfi(z) = -i erf(iz)
402 cmplx FADDEEVA(erfi)(cmplx z, double relerr)
403 {
404  cmplx e = FADDEEVA(erf)(C(-cimag(z),creal(z)), relerr);
405  return C(cimag(e), -creal(e));
406 }
407 
408 // erfi(x) = -i erf(ix)
409 double FADDEEVA_RE(erfi)(double x)
410 {
411  return x*x > 720 ? (x > 0 ? Inf : -Inf)
412  : exp(x*x) * FADDEEVA(w_im)(x);
413 }
414 
415 // erfc(x) = 1 - erf(x)
416 double FADDEEVA_RE(erfc)(double x)
417 {
418 #if !defined(__cplusplus)
419  return erfc(x); // C99 supplies erfc in math.h
420 #elif (__cplusplus >= 201103L) || defined(HAVE_ERFC)
421  return ::erfc(x); // C++11 supplies std::erfc in cmath
422 #else
423  if (x*x > 750) // underflow
424  return (x >= 0 ? 0.0 : 2.0);
425  return x >= 0 ? exp(-x*x) * FADDEEVA_RE(erfcx)(x)
426  : 2. - exp(-x*x) * FADDEEVA_RE(erfcx)(-x);
427 #endif
428 }
429 
430 // erfc(z) = 1 - erf(z)
431 cmplx FADDEEVA(erfc)(cmplx z, double relerr)
432 {
433  double x = creal(z), y = cimag(z);
434 
435  if (x == 0.)
436  return C(1,
437  /* handle y -> Inf limit manually, since
438  exp(y^2) -> Inf but Im[w(y)] -> 0, so
439  IEEE will give us a NaN when it should be Inf */
440  y*y > 720 ? (y > 0 ? -Inf : Inf)
441  : -exp(y*y) * FADDEEVA(w_im)(y));
442  if (y == 0.) {
443  if (x*x > 750) // underflow
444  return C(x >= 0 ? 0.0 : 2.0,
445  -y); // preserve sign of 0
446  return C(x >= 0 ? exp(-x*x) * FADDEEVA_RE(erfcx)(x)
447  : 2. - exp(-x*x) * FADDEEVA_RE(erfcx)(-x),
448  -y); // preserve sign of zero
449  }
450 
451  double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
452  double mIm_z2 = -2*x*y; // Im(-z^2)
453  if (mRe_z2 < -750) // underflow
454  return (x >= 0 ? 0.0 : 2.0);
455 
456  if (x >= 0)
457  return cexp(C(mRe_z2, mIm_z2))
458  * FADDEEVA(w)(C(-y,x), relerr);
459  else
460  return 2.0 - cexp(C(mRe_z2, mIm_z2))
461  * FADDEEVA(w)(C(y,-x), relerr);
462 }
463 
464 // compute Dawson(x) = sqrt(pi)/2 * exp(-x^2) * erfi(x)
465 double FADDEEVA_RE(Dawson)(double x)
466 {
467  const double spi2 = 0.8862269254527580136490837416705725913990; // sqrt(pi)/2
468  return spi2 * FADDEEVA(w_im)(x);
469 }
470 
471 // compute Dawson(z) = sqrt(pi)/2 * exp(-z^2) * erfi(z)
472 cmplx FADDEEVA(Dawson)(cmplx z, double relerr)
473 {
474  const double spi2 = 0.8862269254527580136490837416705725913990; // sqrt(pi)/2
475  double x = creal(z), y = cimag(z);
476 
477  // handle axes separately for speed & proper handling of x or y = Inf or NaN
478  if (y == 0)
479  return C(spi2 * FADDEEVA(w_im)(x),
480  -y); // preserve sign of 0
481  if (x == 0) {
482  double y2 = y*y;
483  if (y2 < 2.5e-5) { // Taylor expansion
484  return C(x, // preserve sign of 0
485  y * (1.
486  + y2 * (0.6666666666666666666666666666666666666667
487  + y2 * 0.26666666666666666666666666666666666667)));
488  }
489  return C(x, // preserve sign of 0
490  spi2 * (y >= 0
491  ? exp(y2) - FADDEEVA_RE(erfcx)(y)
492  : FADDEEVA_RE(erfcx)(-y) - exp(y2)));
493  }
494 
495  double mRe_z2 = (y - x) * (x + y); // Re(-z^2), being careful of overflow
496  double mIm_z2 = -2*x*y; // Im(-z^2)
497  cmplx mz2 = C(mRe_z2, mIm_z2); // -z^2
498 
499  /* Handle positive and negative x via different formulas,
500  using the mirror symmetries of w, to avoid overflow/underflow
501  problems from multiplying exponentially large and small quantities. */
502  if (y >= 0) {
503  if (y < 5e-3) {
504  if (fabs(x) < 5e-3)
505  goto taylor;
506  else if (fabs(mIm_z2) < 5e-3)
507  goto taylor_realaxis;
508  }
509  cmplx res = cexp(mz2) - FADDEEVA(w)(z, relerr);
510  return spi2 * C(-cimag(res), creal(res));
511  }
512  else { // y < 0
513  if (y > -5e-3) { // duplicate from above to avoid fabs(x) call
514  if (fabs(x) < 5e-3)
515  goto taylor;
516  else if (fabs(mIm_z2) < 5e-3)
517  goto taylor_realaxis;
518  }
519  else if (isnan(y))
520  return C(x == 0 ? 0 : NaN, NaN);
521  cmplx res = FADDEEVA(w)(-z, relerr) - cexp(mz2);
522  return spi2 * C(-cimag(res), creal(res));
523  }
524 
525  // Use Taylor series for small |z|, to avoid cancellation inaccuracy
526  // dawson(z) = z - 2/3 z^3 + 4/15 z^5 + ...
527  taylor:
528  return z * (1.
529  + mz2 * (0.6666666666666666666666666666666666666667
530  + mz2 * 0.2666666666666666666666666666666666666667));
531 
532  /* for small |y| and small |xy|,
533  use Taylor series to avoid cancellation inaccuracy:
534  dawson(x + iy)
535  = D + y^2 (D + x - 2Dx^2)
536  + y^4 (D/2 + 5x/6 - 2Dx^2 - x^3/3 + 2Dx^4/3)
537  + iy [ (1-2Dx) + 2/3 y^2 (1 - 3Dx - x^2 + 2Dx^3)
538  + y^4/15 (4 - 15Dx - 9x^2 + 20Dx^3 + 2x^4 - 4Dx^5) ] + ...
539  where D = dawson(x)
540 
541  However, for large |x|, 2Dx -> 1 which gives cancellation problems in
542  this series (many of the leading terms cancel). So, for large |x|,
543  we need to substitute a continued-fraction expansion for D.
544 
545  dawson(x) = 0.5 / (x-0.5/(x-1/(x-1.5/(x-2/(x-2.5/(x...))))))
546 
547  The 6 terms shown here seems to be the minimum needed to be
548  accurate as soon as the simpler Taylor expansion above starts
549  breaking down. Using this 6-term expansion, factoring out the
550  denominator, and simplifying with Maple, we obtain:
551 
552  Re dawson(x + iy) * (-15 + 90x^2 - 60x^4 + 8x^6) / x
553  = 33 - 28x^2 + 4x^4 + y^2 (18 - 4x^2) + 4 y^4
554  Im dawson(x + iy) * (-15 + 90x^2 - 60x^4 + 8x^6) / y
555  = -15 + 24x^2 - 4x^4 + 2/3 y^2 (6x^2 - 15) - 4 y^4
556 
557  Finally, for |x| > 5e7, we can use a simpler 1-term continued-fraction
558  expansion for the real part, and a 2-term expansion for the imaginary
559  part. (This avoids overflow problems for huge |x|.) This yields:
560 
561  Re dawson(x + iy) = [1 + y^2 (1 + y^2/2 - (xy)^2/3)] / (2x)
562  Im dawson(x + iy) = y [ -1 - 2/3 y^2 + y^4/15 (2x^2 - 4) ] / (2x^2 - 1)
563 
564  */
565  taylor_realaxis:
566  {
567  double x2 = x*x;
568  if (x2 > 1600) { // |x| > 40
569  double y2 = y*y;
570  if (x2 > 25e14) {// |x| > 5e7
571  double xy2 = (x*y)*(x*y);
572  return C((0.5 + y2 * (0.5 + 0.25*y2
573  - 0.16666666666666666667*xy2)) / x,
574  y * (-1 + y2 * (-0.66666666666666666667
575  + 0.13333333333333333333*xy2
576  - 0.26666666666666666667*y2))
577  / (2*x2 - 1));
578  }
579  return (1. / (-15 + x2*(90 + x2*(-60 + 8*x2)))) *
580  C(x * (33 + x2 * (-28 + 4*x2)
581  + y2 * (18 - 4*x2 + 4*y2)),
582  y * (-15 + x2 * (24 - 4*x2)
583  + y2 * (4*x2 - 10 - 4*y2)));
584  }
585  else {
586  double D = spi2 * FADDEEVA(w_im)(x);
587  double x2 = x*x, y2 = y*y;
588  return C
589  (D + y2 * (D + x - 2*D*x2)
590  + y2*y2 * (D * (0.5 - x2 * (2 - 0.66666666666666666667*x2))
591  + x * (0.83333333333333333333
592  - 0.33333333333333333333 * x2)),
593  y * (1 - 2*D*x
594  + y2 * 0.66666666666666666667 * (1 - x2 - D*x * (3 - 2*x2))
595  + y2*y2 * (0.26666666666666666667 -
596  x2 * (0.6 - 0.13333333333333333333 * x2)
597  - D*x * (1 - x2 * (1.3333333333333333333
598  - 0.26666666666666666667 * x2)))));
599  }
600  }
601 }
602 
603 /////////////////////////////////////////////////////////////////////////
604 
605 // return sinc(x) = sin(x)/x, given both x and sin(x)
606 // [since we only use this in cases where sin(x) has already been computed]
607 static inline double sinc(double x, double sinx) {
608  return fabs(x) < 1e-4 ? 1 - (0.1666666666666666666667)*x*x : sinx / x;
609 }
610 
611 // sinh(x) via Taylor series, accurate to machine precision for |x| < 1e-2
612 static inline double sinh_taylor(double x) {
613  return x * (1 + (x*x) * (0.1666666666666666666667
614  + 0.00833333333333333333333 * (x*x)));
615 }
616 
617 static inline double sqr(double x) { return x*x; }
618 
619 // precomputed table of expa2n2[n-1] = exp(-a2*n*n)
620 // for double-precision a2 = 0.26865... in FADDEEVA(w), below.
621 static const double expa2n2[] = {
622  7.64405281671221563e-01,
623  3.41424527166548425e-01,
624  8.91072646929412548e-02,
625  1.35887299055460086e-02,
626  1.21085455253437481e-03,
627  6.30452613933449404e-05,
628  1.91805156577114683e-06,
629  3.40969447714832381e-08,
630  3.54175089099469393e-10,
631  2.14965079583260682e-12,
632  7.62368911833724354e-15,
633  1.57982797110681093e-17,
634  1.91294189103582677e-20,
635  1.35344656764205340e-23,
636  5.59535712428588720e-27,
637  1.35164257972401769e-30,
638  1.90784582843501167e-34,
639  1.57351920291442930e-38,
640  7.58312432328032845e-43,
641  2.13536275438697082e-47,
642  3.51352063787195769e-52,
643  3.37800830266396920e-57,
644  1.89769439468301000e-62,
645  6.22929926072668851e-68,
646  1.19481172006938722e-73,
647  1.33908181133005953e-79,
648  8.76924303483223939e-86,
649  3.35555576166254986e-92,
650  7.50264110688173024e-99,
651  9.80192200745410268e-106,
652  7.48265412822268959e-113,
653  3.33770122566809425e-120,
654  8.69934598159861140e-128,
655  1.32486951484088852e-135,
656  1.17898144201315253e-143,
657  6.13039120236180012e-152,
658  1.86258785950822098e-160,
659  3.30668408201432783e-169,
660  3.43017280887946235e-178,
661  2.07915397775808219e-187,
662  7.36384545323984966e-197,
663  1.52394760394085741e-206,
664  1.84281935046532100e-216,
665  1.30209553802992923e-226,
666  5.37588903521080531e-237,
667  1.29689584599763145e-247,
668  1.82813078022866562e-258,
669  1.50576355348684241e-269,
670  7.24692320799294194e-281,
671  2.03797051314726829e-292,
672  3.34880215927873807e-304,
673  0.0 // underflow (also prevents reads past array end, below)
674 };
675 
676 /////////////////////////////////////////////////////////////////////////
677 
678 cmplx FADDEEVA(w)(cmplx z, double relerr)
679 {
680  if (creal(z) == 0.0)
681  return C(FADDEEVA_RE(erfcx)(cimag(z)),
682  creal(z)); // give correct sign of 0 in cimag(w)
683  else if (cimag(z) == 0)
684  return C(exp(-sqr(creal(z))),
685  FADDEEVA(w_im)(creal(z)));
686 
687  double a, a2, c;
688  if (relerr <= DBL_EPSILON) {
689  relerr = DBL_EPSILON;
690  a = 0.518321480430085929872; // pi / sqrt(-log(eps*0.5))
691  c = 0.329973702884629072537; // (2/pi) * a;
692  a2 = 0.268657157075235951582; // a^2
693  }
694  else {
695  const double pi = 3.14159265358979323846264338327950288419716939937510582;
696  if (relerr > 0.1) relerr = 0.1; // not sensible to compute < 1 digit
697  a = pi / sqrt(-log(relerr*0.5));
698  c = (2/pi)*a;
699  a2 = a*a;
700  }
701  const double x = fabs(creal(z));
702  const double y = cimag(z), ya = fabs(y);
703 
704  cmplx ret = 0.; // return value
705 
706  double sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0;
707 
708 #define USE_CONTINUED_FRACTION 1 // 1 to use continued fraction for large |z|
709 
710 #if USE_CONTINUED_FRACTION
711  if (ya > 7 || (x > 6 // continued fraction is faster
712  /* As pointed out by M. Zaghloul, the continued
713  fraction seems to give a large relative error in
714  Re w(z) for |x| ~ 6 and small |y|, so use
715  algorithm 816 in this region: */
716  && (ya > 0.1 || (x > 8 && ya > 1e-10) || x > 28))) {
717 
718  /* Poppe & Wijers suggest using a number of terms
719  nu = 3 + 1442 / (26*rho + 77)
720  where rho = sqrt((x/x0)^2 + (y/y0)^2) where x0=6.3, y0=4.4.
721  (They only use this expansion for rho >= 1, but rho a little less
722  than 1 seems okay too.)
723  Instead, I did my own fit to a slightly different function
724  that avoids the hypotenuse calculation, using NLopt to minimize
725  the sum of the squares of the errors in nu with the constraint
726  that the estimated nu be >= minimum nu to attain machine precision.
727  I also separate the regions where nu == 2 and nu == 1. */
728  const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
729  double xs = y < 0 ? -creal(z) : creal(z); // compute for -z if y < 0
730  if (x + ya > 4000) { // nu <= 2
731  if (x + ya > 1e7) { // nu == 1, w(z) = i/sqrt(pi) / z
732  // scale to avoid overflow
733  if (x > ya) {
734  double yax = ya / xs;
735  double denom = ispi / (xs + yax*ya);
736  ret = C(denom*yax, denom);
737  }
738  else if (isinf(ya))
739  return ((isnan(x) || y < 0)
740  ? C(NaN,NaN) : C(0,0));
741  else {
742  double xya = xs / ya;
743  double denom = ispi / (xya*xs + ya);
744  ret = C(denom, denom*xya);
745  }
746  }
747  else { // nu == 2, w(z) = i/sqrt(pi) * z / (z*z - 0.5)
748  double dr = xs*xs - ya*ya - 0.5, di = 2*xs*ya;
749  double denom = ispi / (dr*dr + di*di);
750  ret = C(denom * (xs*di-ya*dr), denom * (xs*dr+ya*di));
751  }
752  }
753  else { // compute nu(z) estimate and do general continued fraction
754  const double c0=3.9, c1=11.398, c2=0.08254, c3=0.1421, c4=0.2023; // fit
755  double nu = floor(c0 + c1 / (c2*x + c3*ya + c4));
756  double wr = xs, wi = ya;
757  for (nu = 0.5 * (nu - 1); nu > 0.4; nu -= 0.5) {
758  // w <- z - nu/w:
759  double denom = nu / (wr*wr + wi*wi);
760  wr = xs - wr * denom;
761  wi = ya + wi * denom;
762  }
763  { // w(z) = i/sqrt(pi) / w:
764  double denom = ispi / (wr*wr + wi*wi);
765  ret = C(denom*wi, denom*wr);
766  }
767  }
768  if (y < 0) {
769  // use w(z) = 2.0*exp(-z*z) - w(-z),
770  // but be careful of overflow in exp(-z*z)
771  // = exp(-(xs*xs-ya*ya) -2*i*xs*ya)
772  return 2.0*cexp(C((ya-xs)*(xs+ya), 2*xs*y)) - ret;
773  }
774  else
775  return ret;
776  }
777 #else // !USE_CONTINUED_FRACTION
778  if (x + ya > 1e7) { // w(z) = i/sqrt(pi) / z, to machine precision
779  const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
780  double xs = y < 0 ? -creal(z) : creal(z); // compute for -z if y < 0
781  // scale to avoid overflow
782  if (x > ya) {
783  double yax = ya / xs;
784  double denom = ispi / (xs + yax*ya);
785  ret = C(denom*yax, denom);
786  }
787  else {
788  double xya = xs / ya;
789  double denom = ispi / (xya*xs + ya);
790  ret = C(denom, denom*xya);
791  }
792  if (y < 0) {
793  // use w(z) = 2.0*exp(-z*z) - w(-z),
794  // but be careful of overflow in exp(-z*z)
795  // = exp(-(xs*xs-ya*ya) -2*i*xs*ya)
796  return 2.0*cexp(C((ya-xs)*(xs+ya), 2*xs*y)) - ret;
797  }
798  else
799  return ret;
800  }
801 #endif // !USE_CONTINUED_FRACTION
802 
803  /* Note: The test that seems to be suggested in the paper is x <
804  sqrt(-log(DBL_MIN)), about 26.6, since otherwise exp(-x^2)
805  underflows to zero and sum1,sum2,sum4 are zero. However, long
806  before this occurs, the sum1,sum2,sum4 contributions are
807  negligible in double precision; I find that this happens for x >
808  about 6, for all y. On the other hand, I find that the case
809  where we compute all of the sums is faster (at least with the
810  precomputed expa2n2 table) until about x=10. Furthermore, if we
811  try to compute all of the sums for x > 20, I find that we
812  sometimes run into numerical problems because underflow/overflow
813  problems start to appear in the various coefficients of the sums,
814  below. Therefore, we use x < 10 here. */
815  else if (x < 10) {
816  double prod2ax = 1, prodm2ax = 1;
817  double expx2;
818 
819  if (isnan(y))
820  return C(y,y);
821 
822  /* Somewhat ugly copy-and-paste duplication here, but I see significant
823  speedups from using the special-case code with the precomputed
824  exponential, and the x < 5e-4 special case is needed for accuracy. */
825 
826  if (relerr == DBL_EPSILON) { // use precomputed exp(-a2*(n*n)) table
827  if (x < 5e-4) { // compute sum4 and sum5 together as sum5-sum4
828  const double x2 = x*x;
829  expx2 = 1 - x2 * (1 - 0.5*x2); // exp(-x*x) via Taylor
830  // compute exp(2*a*x) and exp(-2*a*x) via Taylor, to double precision
831  const double ax2 = 1.036642960860171859744*x; // 2*a*x
832  const double exp2ax =
833  1 + ax2 * (1 + ax2 * (0.5 + 0.166666666666666666667*ax2));
834  const double expm2ax =
835  1 - ax2 * (1 - ax2 * (0.5 - 0.166666666666666666667*ax2));
836  for (int n = 1; 1; ++n) {
837  const double coef = expa2n2[n-1] * expx2 / (a2*(n*n) + y*y);
838  prod2ax *= exp2ax;
839  prodm2ax *= expm2ax;
840  sum1 += coef;
841  sum2 += coef * prodm2ax;
842  sum3 += coef * prod2ax;
843 
844  // really = sum5 - sum4
845  sum5 += coef * (2*a) * n * sinh_taylor((2*a)*n*x);
846 
847  // test convergence via sum3
848  if (coef * prod2ax < relerr * sum3) break;
849  }
850  }
851  else { // x > 5e-4, compute sum4 and sum5 separately
852  expx2 = exp(-x*x);
853  const double exp2ax = exp((2*a)*x), expm2ax = 1 / exp2ax;
854  for (int n = 1; 1; ++n) {
855  const double coef = expa2n2[n-1] * expx2 / (a2*(n*n) + y*y);
856  prod2ax *= exp2ax;
857  prodm2ax *= expm2ax;
858  sum1 += coef;
859  sum2 += coef * prodm2ax;
860  sum4 += (coef * prodm2ax) * (a*n);
861  sum3 += coef * prod2ax;
862  sum5 += (coef * prod2ax) * (a*n);
863  // test convergence via sum5, since this sum has the slowest decay
864  if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
865  }
866  }
867  }
868  else { // relerr != DBL_EPSILON, compute exp(-a2*(n*n)) on the fly
869  const double exp2ax = exp((2*a)*x), expm2ax = 1 / exp2ax;
870  if (x < 5e-4) { // compute sum4 and sum5 together as sum5-sum4
871  const double x2 = x*x;
872  expx2 = 1 - x2 * (1 - 0.5*x2); // exp(-x*x) via Taylor
873  for (int n = 1; 1; ++n) {
874  const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
875  prod2ax *= exp2ax;
876  prodm2ax *= expm2ax;
877  sum1 += coef;
878  sum2 += coef * prodm2ax;
879  sum3 += coef * prod2ax;
880 
881  // really = sum5 - sum4
882  sum5 += coef * (2*a) * n * sinh_taylor((2*a)*n*x);
883 
884  // test convergence via sum3
885  if (coef * prod2ax < relerr * sum3) break;
886  }
887  }
888  else { // x > 5e-4, compute sum4 and sum5 separately
889  expx2 = exp(-x*x);
890  for (int n = 1; 1; ++n) {
891  const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
892  prod2ax *= exp2ax;
893  prodm2ax *= expm2ax;
894  sum1 += coef;
895  sum2 += coef * prodm2ax;
896  sum4 += (coef * prodm2ax) * (a*n);
897  sum3 += coef * prod2ax;
898  sum5 += (coef * prod2ax) * (a*n);
899  // test convergence via sum5, since this sum has the slowest decay
900  if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
901  }
902  }
903  }
904  const double expx2erfcxy = // avoid spurious overflow for large negative y
905  y > -6 // for y < -6, erfcx(y) = 2*exp(y*y) to double precision
906  ? expx2*FADDEEVA_RE(erfcx)(y) : 2*exp(y*y-x*x);
907  if (y > 5) { // imaginary terms cancel
908  const double sinxy = sin(x*y);
909  ret = (expx2erfcxy - c*y*sum1) * cos(2*x*y)
910  + (c*x*expx2) * sinxy * sinc(x*y, sinxy);
911  }
912  else {
913  double xs = creal(z);
914  const double sinxy = sin(xs*y);
915  const double sin2xy = sin(2*xs*y), cos2xy = cos(2*xs*y);
916  const double coef1 = expx2erfcxy - c*y*sum1;
917  const double coef2 = c*xs*expx2;
918  ret = C(coef1 * cos2xy + coef2 * sinxy * sinc(xs*y, sinxy),
919  coef2 * sinc(2*xs*y, sin2xy) - coef1 * sin2xy);
920  }
921  }
922  else { // x large: only sum3 & sum5 contribute (see above note)
923  if (isnan(x))
924  return C(x,x);
925  if (isnan(y))
926  return C(y,y);
927 
928 #if USE_CONTINUED_FRACTION
929  ret = exp(-x*x); // |y| < 1e-10, so we only need exp(-x*x) term
930 #else
931  if (y < 0) {
932  /* erfcx(y) ~ 2*exp(y*y) + (< 1) if y < 0, so
933  erfcx(y)*exp(-x*x) ~ 2*exp(y*y-x*x) term may not be negligible
934  if y*y - x*x > -36 or so. So, compute this term just in case.
935  We also need the -exp(-x*x) term to compute Re[w] accurately
936  in the case where y is very small. */
937  ret = cpolar(2*exp(y*y-x*x) - exp(-x*x), -2*creal(z)*y);
938  }
939  else
940  ret = exp(-x*x); // not negligible in real part if y very small
941 #endif
942  // (round instead of ceil as in original paper; note that x/a > 1 here)
943  double n0 = floor(x/a + 0.5); // sum in both directions, starting at n0
944  double dx = a*n0 - x;
945  sum3 = exp(-dx*dx) / (a2*(n0*n0) + y*y);
946  sum5 = a*n0 * sum3;
947  double exp1 = exp(4*a*dx), exp1dn = 1;
948  int dn;
949  for (dn = 1; n0 - dn > 0; ++dn) { // loop over n0-dn and n0+dn terms
950  double np = n0 + dn, nm = n0 - dn;
951  double tp = exp(-sqr(a*dn+dx));
952  double tm = tp * (exp1dn *= exp1); // trick to get tm from tp
953  tp /= (a2*(np*np) + y*y);
954  tm /= (a2*(nm*nm) + y*y);
955  sum3 += tp + tm;
956  sum5 += a * (np * tp + nm * tm);
957  if (a * (np * tp + nm * tm) < relerr * sum5) goto finish;
958  }
959  while (1) { // loop over n0+dn terms only (since n0-dn <= 0)
960  double np = n0 + dn++;
961  double tp = exp(-sqr(a*dn+dx)) / (a2*(np*np) + y*y);
962  sum3 += tp;
963  sum5 += a * np * tp;
964  if (a * np * tp < relerr * sum5) goto finish;
965  }
966  }
967  finish:
968  return ret + C((0.5*c)*y*(sum2+sum3),
969  (0.5*c)*copysign(sum5-sum4, creal(z)));
970 }
971 
972 /////////////////////////////////////////////////////////////////////////
973 
974 /* erfcx(x) = exp(x^2) erfc(x) function, for real x, written by
975  Steven G. Johnson, October 2012.
976 
977  This function combines a few different ideas.
978 
979  First, for x > 50, it uses a continued-fraction expansion (same as
980  for the Faddeeva function, but with algebraic simplifications for z=i*x).
981 
982  Second, for 0 <= x <= 50, it uses Chebyshev polynomial approximations,
983  but with two twists:
984 
985  a) It maps x to y = 4 / (4+x) in [0,1]. This simple transformation,
986  inspired by a similar transformation in the octave-forge/specfun
987  erfcx by Soren Hauberg, results in much faster Chebyshev convergence
988  than other simple transformations I have examined.
989 
990  b) Instead of using a single Chebyshev polynomial for the entire
991  [0,1] y interval, we break the interval up into 100 equal
992  subintervals, with a switch/lookup table, and use much lower
993  degree Chebyshev polynomials in each subinterval. This greatly
994  improves performance in my tests.
995 
996  For x < 0, we use the relationship erfcx(-x) = 2 exp(x^2) - erfc(x),
997  with the usual checks for overflow etcetera.
998 
999  Performance-wise, it seems to be substantially faster than either
1000  the SLATEC DERFC function [or an erfcx function derived therefrom]
1001  or Cody's CALERF function (from netlib.org/specfun), while
1002  retaining near machine precision in accuracy. */
1003 
1004 /* Given y100=100*y, where y = 4/(4+x) for x >= 0, compute erfc(x).
1005 
1006  Uses a look-up table of 100 different Chebyshev polynomials
1007  for y intervals [0,0.01], [0.01,0.02], ...., [0.99,1], generated
1008  with the help of Maple and a little shell script. This allows
1009  the Chebyshev polynomials to be of significantly lower degree (about 1/4)
1010  compared to fitting the whole [0,1] interval with a single polynomial. */
1011 static double erfcx_y100(double y100)
1012 {
1013  switch ((int) y100) {
1014 case 0: {
1015 double t = 2*y100 - 1;
1016 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;
1017 }
1018 case 1: {
1019 double t = 2*y100 - 3;
1020 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;
1021 }
1022 case 2: {
1023 double t = 2*y100 - 5;
1024 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;
1025 }
1026 case 3: {
1027 double t = 2*y100 - 7;
1028 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;
1029 }
1030 case 4: {
1031 double t = 2*y100 - 9;
1032 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;
1033 }
1034 case 5: {
1035 double t = 2*y100 - 11;
1036 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;
1037 }
1038 case 6: {
1039 double t = 2*y100 - 13;
1040 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;
1041 }
1042 case 7: {
1043 double t = 2*y100 - 15;
1044 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;
1045 }
1046 case 8: {
1047 double t = 2*y100 - 17;
1048 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;
1049 }
1050 case 9: {
1051 double t = 2*y100 - 19;
1052 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;
1053 }
1054 case 10: {
1055 double t = 2*y100 - 21;
1056 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;
1057 }
1058 case 11: {
1059 double t = 2*y100 - 23;
1060 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;
1061 }
1062 case 12: {
1063 double t = 2*y100 - 25;
1064 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;
1065 }
1066 case 13: {
1067 double t = 2*y100 - 27;
1068 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;
1069 }
1070 case 14: {
1071 double t = 2*y100 - 29;
1072 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;
1073 }
1074 case 15: {
1075 double t = 2*y100 - 31;
1076 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;
1077 }
1078 case 16: {
1079 double t = 2*y100 - 33;
1080 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;
1081 }
1082 case 17: {
1083 double t = 2*y100 - 35;
1084 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;
1085 }
1086 case 18: {
1087 double t = 2*y100 - 37;
1088 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;
1089 }
1090 case 19: {
1091 double t = 2*y100 - 39;
1092 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;
1093 }
1094 case 20: {
1095 double t = 2*y100 - 41;
1096 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;
1097 }
1098 case 21: {
1099 double t = 2*y100 - 43;
1100 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;
1101 }
1102 case 22: {
1103 double t = 2*y100 - 45;
1104 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;
1105 }
1106 case 23: {
1107 double t = 2*y100 - 47;
1108 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;
1109 }
1110 case 24: {
1111 double t = 2*y100 - 49;
1112 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;
1113 }
1114 case 25: {
1115 double t = 2*y100 - 51;
1116 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;
1117 }
1118 case 26: {
1119 double t = 2*y100 - 53;
1120 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;
1121 }
1122 case 27: {
1123 double t = 2*y100 - 55;
1124 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;
1125 }
1126 case 28: {
1127 double t = 2*y100 - 57;
1128 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;
1129 }
1130 case 29: {
1131 double t = 2*y100 - 59;
1132 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;
1133 }
1134 case 30: {
1135 double t = 2*y100 - 61;
1136 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;
1137 }
1138 case 31: {
1139 double t = 2*y100 - 63;
1140 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;
1141 }
1142 case 32: {
1143 double t = 2*y100 - 65;
1144 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;
1145 }
1146 case 33: {
1147 double t = 2*y100 - 67;
1148 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;
1149 }
1150 case 34: {
1151 double t = 2*y100 - 69;
1152 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;
1153 }
1154 case 35: {
1155 double t = 2*y100 - 71;
1156 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;
1157 }
1158 case 36: {
1159 double t = 2*y100 - 73;
1160 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;
1161 }
1162 case 37: {
1163 double t = 2*y100 - 75;
1164 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;
1165 }
1166 case 38: {
1167 double t = 2*y100 - 77;
1168 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;
1169 }
1170 case 39: {
1171 double t = 2*y100 - 79;
1172 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;
1173 }
1174 case 40: {
1175 double t = 2*y100 - 81;
1176 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;
1177 }
1178 case 41: {
1179 double t = 2*y100 - 83;
1180 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;
1181 }
1182 case 42: {
1183 double t = 2*y100 - 85;
1184 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;
1185 }
1186 case 43: {
1187 double t = 2*y100 - 87;
1188 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;
1189 }
1190 case 44: {
1191 double t = 2*y100 - 89;
1192 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;
1193 }
1194 case 45: {
1195 double t = 2*y100 - 91;
1196 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;
1197 }
1198 case 46: {
1199 double t = 2*y100 - 93;
1200 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;
1201 }
1202 case 47: {
1203 double t = 2*y100 - 95;
1204 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;
1205 }
1206 case 48: {
1207 double t = 2*y100 - 97;
1208 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;
1209 }
1210 case 49: {
1211 double t = 2*y100 - 99;
1212 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;
1213 }
1214 case 50: {
1215 double t = 2*y100 - 101;
1216 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;
1217 }
1218 case 51: {
1219 double t = 2*y100 - 103;
1220 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;
1221 }
1222 case 52: {
1223 double t = 2*y100 - 105;
1224 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;
1225 }
1226 case 53: {
1227 double t = 2*y100 - 107;
1228 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;
1229 }
1230 case 54: {
1231 double t = 2*y100 - 109;
1232 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;
1233 }
1234 case 55: {
1235 double t = 2*y100 - 111;
1236 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;
1237 }
1238 case 56: {
1239 double t = 2*y100 - 113;
1240 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;
1241 }
1242 case 57: {
1243 double t = 2*y100 - 115;
1244 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;
1245 }
1246 case 58: {
1247 double t = 2*y100 - 117;
1248 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;
1249 }
1250 case 59: {
1251 double t = 2*y100 - 119;
1252 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;
1253 }
1254 case 60: {
1255 double t = 2*y100 - 121;
1256 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;
1257 }
1258 case 61: {
1259 double t = 2*y100 - 123;
1260 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;
1261 }
1262 case 62: {
1263 double t = 2*y100 - 125;
1264 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;
1265 }
1266 case 63: {
1267 double t = 2*y100 - 127;
1268 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;
1269 }
1270 case 64: {
1271 double t = 2*y100 - 129;
1272 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;
1273 }
1274 case 65: {
1275 double t = 2*y100 - 131;
1276 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;
1277 }
1278 case 66: {
1279 double t = 2*y100 - 133;
1280 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;
1281 }
1282 case 67: {
1283 double t = 2*y100 - 135;
1284 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;
1285 }
1286 case 68: {
1287 double t = 2*y100 - 137;
1288 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;
1289 }
1290 case 69: {
1291 double t = 2*y100 - 139;
1292 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;
1293 }
1294 case 70: {
1295 double t = 2*y100 - 141;
1296 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;
1297 }
1298 case 71: {
1299 double t = 2*y100 - 143;
1300 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;
1301 }
1302 case 72: {
1303 double t = 2*y100 - 145;
1304 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;
1305 }
1306 case 73: {
1307 double t = 2*y100 - 147;
1308 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;
1309 }
1310 case 74: {
1311 double t = 2*y100 - 149;
1312 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;
1313 }
1314 case 75: {
1315 double t = 2*y100 - 151;
1316 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;
1317 }
1318 case 76: {
1319 double t = 2*y100 - 153;
1320 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;
1321 }
1322 case 77: {
1323 double t = 2*y100 - 155;
1324 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;
1325 }
1326 case 78: {
1327 double t = 2*y100 - 157;
1328 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;
1329 }
1330 case 79: {
1331 double t = 2*y100 - 159;
1332 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;
1333 }
1334 case 80: {
1335 double t = 2*y100 - 161;
1336 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;
1337 }
1338 case 81: {
1339 double t = 2*y100 - 163;
1340 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;
1341 }
1342 case 82: {
1343 double t = 2*y100 - 165;
1344 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;
1345 }
1346 case 83: {
1347 double t = 2*y100 - 167;
1348 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;
1349 }
1350 case 84: {
1351 double t = 2*y100 - 169;
1352 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;
1353 }
1354 case 85: {
1355 double t = 2*y100 - 171;
1356 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;
1357 }
1358 case 86: {
1359 double t = 2*y100 - 173;
1360 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;
1361 }
1362 case 87: {
1363 double t = 2*y100 - 175;
1364 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;
1365 }
1366 case 88: {
1367 double t = 2*y100 - 177;
1368 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;
1369 }
1370 case 89: {
1371 double t = 2*y100 - 179;
1372 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;
1373 }
1374 case 90: {
1375 double t = 2*y100 - 181;
1376 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;
1377 }
1378 case 91: {
1379 double t = 2*y100 - 183;
1380 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;
1381 }
1382 case 92: {
1383 double t = 2*y100 - 185;
1384 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;
1385 }
1386 case 93: {
1387 double t = 2*y100 - 187;
1388 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;
1389 }
1390 case 94: {
1391 double t = 2*y100 - 189;
1392 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;
1393 }
1394 case 95: {
1395 double t = 2*y100 - 191;
1396 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;
1397 }
1398 case 96: {
1399 double t = 2*y100 - 193;
1400 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;
1401 }
1402 case 97: {
1403 double t = 2*y100 - 195;
1404 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;
1405 }
1406 case 98: {
1407 double t = 2*y100 - 197;
1408 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;
1409 }
1410 case 99: {
1411 double t = 2*y100 - 199;
1412 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;
1413 }
1414  }
1415  // we only get here if y = 1, i.e. |x| < 4*eps, in which case
1416  // erfcx is within 1e-15 of 1..
1417  return 1.0;
1418 }
1419 
1420 double FADDEEVA_RE(erfcx)(double x)
1421 {
1422  if (x >= 0) {
1423  if (x > 50) { // continued-fraction expansion is faster
1424  const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
1425  if (x > 5e7) // 1-term expansion, important to avoid overflow
1426  return ispi / x;
1427  /* 5-term expansion (rely on compiler for CSE), simplified from:
1428  ispi / (x+0.5/(x+1/(x+1.5/(x+2/x)))) */
1429  return ispi*((x*x) * (x*x+4.5) + 2) / (x * ((x*x) * (x*x+5) + 3.75));
1430  }
1431  return erfcx_y100(400/(4+x));
1432  }
1433  else
1434  return x < -26.7 ? HUGE_VAL : (x < -6.1 ? 2*exp(x*x)
1435  : 2*exp(x*x) - erfcx_y100(400/(4-x)));
1436 }
1437 
1438 /////////////////////////////////////////////////////////////////////////
1439 /* Compute a scaled Dawson integral
1440  FADDEEVA(w_im)(x) = 2*Dawson(x)/sqrt(pi)
1441  equivalent to the imaginary part w(x) for real x.
1442 
1443  Uses methods similar to the erfcx calculation above: continued fractions
1444  for large |x|, a lookup table of Chebyshev polynomials for smaller |x|,
1445  and finally a Taylor expansion for |x|<0.01.
1446 
1447  Steven G. Johnson, October 2012. */
1448 
1449 /* Given y100=100*y, where y = 1/(1+x) for x >= 0, compute w_im(x).
1450 
1451  Uses a look-up table of 100 different Chebyshev polynomials
1452  for y intervals [0,0.01], [0.01,0.02], ...., [0.99,1], generated
1453  with the help of Maple and a little shell script. This allows
1454  the Chebyshev polynomials to be of significantly lower degree (about 1/30)
1455  compared to fitting the whole [0,1] interval with a single polynomial. */
1456 static double w_im_y100(double y100, double x) {
1457  switch ((int) y100) {
1458  case 0: {
1459  double t = 2*y100 - 1;
1460  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;
1461  }
1462  case 1: {
1463  double t = 2*y100 - 3;
1464  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;
1465  }
1466  case 2: {
1467  double t = 2*y100 - 5;
1468  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;
1469  }
1470  case 3: {
1471  double t = 2*y100 - 7;
1472  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;
1473  }
1474  case 4: {
1475  double t = 2*y100 - 9;
1476  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;
1477  }
1478  case 5: {
1479  double t = 2*y100 - 11;
1480  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;
1481  }
1482  case 6: {
1483  double t = 2*y100 - 13;
1484  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;
1485  }
1486  case 7: {
1487  double t = 2*y100 - 15;
1488  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;
1489  }
1490  case 8: {
1491  double t = 2*y100 - 17;
1492  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;
1493  }
1494  case 9: {
1495  double t = 2*y100 - 19;
1496  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;
1497  }
1498  case 10: {
1499  double t = 2*y100 - 21;
1500  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;
1501  }
1502  case 11: {
1503  double t = 2*y100 - 23;
1504  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;
1505  }
1506  case 12: {
1507  double t = 2*y100 - 25;
1508  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;
1509  }
1510  case 13: {
1511  double t = 2*y100 - 27;
1512  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;
1513  }
1514  case 14: {
1515  double t = 2*y100 - 29;
1516  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;
1517  }
1518  case 15: {
1519  double t = 2*y100 - 31;
1520  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;
1521  }
1522  case 16: {
1523  double t = 2*y100 - 33;
1524  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;
1525  }
1526  case 17: {
1527  double t = 2*y100 - 35;
1528  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;
1529  }
1530  case 18: {
1531  double t = 2*y100 - 37;
1532  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;
1533  }
1534  case 19: {
1535  double t = 2*y100 - 39;
1536  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;
1537  }
1538  case 20: {
1539  double t = 2*y100 - 41;
1540  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;
1541  }
1542  case 21: {
1543  double t = 2*y100 - 43;
1544  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;
1545  }
1546  case 22: {
1547  double t = 2*y100 - 45;
1548  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;
1549  }
1550  case 23: {
1551  double t = 2*y100 - 47;
1552  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;
1553  }
1554  case 24: {
1555  double t = 2*y100 - 49;
1556  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;
1557  }
1558  case 25: {
1559  double t = 2*y100 - 51;
1560  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;
1561  }
1562  case 26: {
1563  double t = 2*y100 - 53;
1564  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;
1565  }
1566  case 27: {
1567  double t = 2*y100 - 55;
1568  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;
1569  }
1570  case 28: {
1571  double t = 2*y100 - 57;
1572  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;
1573  }
1574  case 29: {
1575  double t = 2*y100 - 59;
1576  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;
1577  }
1578  case 30: {
1579  double t = 2*y100 - 61;
1580  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;
1581  }
1582  case 31: {
1583  double t = 2*y100 - 63;
1584  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;
1585  }
1586  case 32: {
1587  double t = 2*y100 - 65;
1588  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;
1589  }
1590  case 33: {
1591  double t = 2*y100 - 67;
1592  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;
1593  }
1594  case 34: {
1595  double t = 2*y100 - 69;
1596  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;
1597  }
1598  case 35: {
1599  double t = 2*y100 - 71;
1600  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;
1601  }
1602  case 36: {
1603  double t = 2*y100 - 73;
1604  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;
1605  }
1606  case 37: {
1607  double t = 2*y100 - 75;
1608  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;
1609  }
1610  case 38: {
1611  double t = 2*y100 - 77;
1612  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;
1613  }
1614  case 39: {
1615  double t = 2*y100 - 79;
1616  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;
1617  }
1618  case 40: {
1619  double t = 2*y100 - 81;
1620  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;
1621  }
1622  case 41: {
1623  double t = 2*y100 - 83;
1624  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;
1625  }
1626  case 42: {
1627  double t = 2*y100 - 85;
1628  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;
1629  }
1630  case 43: {
1631  double t = 2*y100 - 87;
1632  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;
1633  }
1634  case 44: {
1635  double t = 2*y100 - 89;
1636  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;
1637  }
1638  case 45: {
1639  double t = 2*y100 - 91;
1640  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;
1641  }
1642  case 46: {
1643  double t = 2*y100 - 93;
1644  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;
1645  }
1646  case 47: {
1647  double t = 2*y100 - 95;
1648  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;
1649  }
1650  case 48: {
1651  double t = 2*y100 - 97;
1652  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;
1653  }
1654  case 49: {
1655  double t = 2*y100 - 99;
1656  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;
1657  }
1658  case 50: {
1659  double t = 2*y100 - 101;
1660  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;
1661  }
1662  case 51: {
1663  double t = 2*y100 - 103;
1664  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;
1665  }
1666  case 52: {
1667  double t = 2*y100 - 105;
1668  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;
1669  }
1670  case 53: {
1671  double t = 2*y100 - 107;
1672  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;
1673  }
1674  case 54: {
1675  double t = 2*y100 - 109;
1676  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;
1677  }
1678  case 55: {
1679  double t = 2*y100 - 111;
1680  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;
1681  }
1682  case 56: {
1683  double t = 2*y100 - 113;
1684  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;
1685  }
1686  case 57: {
1687  double t = 2*y100 - 115;
1688  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;
1689  }
1690  case 58: {
1691  double t = 2*y100 - 117;
1692  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;
1693  }
1694  case 59: {
1695  double t = 2*y100 - 119;
1696  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;
1697  }
1698  case 60: {
1699  double t = 2*y100 - 121;
1700  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;
1701  }
1702  case 61: {
1703  double t = 2*y100 - 123;
1704  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;
1705  }
1706  case 62: {
1707  double t = 2*y100 - 125;
1708  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;
1709  }
1710  case 63: {
1711  double t = 2*y100 - 127;
1712  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;
1713  }
1714  case 64: {
1715  double t = 2*y100 - 129;
1716  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;
1717  }
1718  case 65: {
1719  double t = 2*y100 - 131;
1720  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;
1721  }
1722  case 66: {
1723  double t = 2*y100 - 133;
1724  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;
1725  }
1726  case 67: {
1727  double t = 2*y100 - 135;
1728  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;
1729  }
1730  case 68: {
1731  double t = 2*y100 - 137;
1732  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;
1733  }
1734  case 69: {
1735  double t = 2*y100 - 139;
1736  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;
1737  }
1738  case 70: {
1739  double t = 2*y100 - 141;
1740  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;
1741  }
1742  case 71: {
1743  double t = 2*y100 - 143;
1744  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;
1745  }
1746  case 72: {
1747  double t = 2*y100 - 145;
1748  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;
1749  }
1750  case 73: {
1751  double t = 2*y100 - 147;
1752  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;
1753  }
1754  case 74: {
1755  double t = 2*y100 - 149;
1756  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;
1757  }
1758  case 75: {
1759  double t = 2*y100 - 151;
1760  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;
1761  }
1762  case 76: {
1763  double t = 2*y100 - 153;
1764  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;
1765  }
1766  case 77: {
1767  double t = 2*y100 - 155;
1768  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;
1769  }
1770  case 78: {
1771  double t = 2*y100 - 157;
1772  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;
1773  }
1774  case 79: {
1775  double t = 2*y100 - 159;
1776  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;
1777  }
1778  case 80: {
1779  double t = 2*y100 - 161;
1780  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;
1781  }
1782  case 81: {
1783  double t = 2*y100 - 163;
1784  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;
1785  }
1786  case 82: {
1787  double t = 2*y100 - 165;
1788  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;
1789  }
1790  case 83: {
1791  double t = 2*y100 - 167;
1792  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;
1793  }
1794  case 84: {
1795  double t = 2*y100 - 169;
1796  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;
1797  }
1798  case 85: {
1799  double t = 2*y100 - 171;
1800  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;
1801  }
1802  case 86: {
1803  double t = 2*y100 - 173;
1804  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;
1805  }
1806  case 87: {
1807  double t = 2*y100 - 175;
1808  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;
1809  }
1810  case 88: {
1811  double t = 2*y100 - 177;
1812  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;
1813  }
1814  case 89: {
1815  double t = 2*y100 - 179;
1816  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;
1817  }
1818  case 90: {
1819  double t = 2*y100 - 181;
1820  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;
1821  }
1822  case 91: {
1823  double t = 2*y100 - 183;
1824  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;
1825  }
1826  case 92: {
1827  double t = 2*y100 - 185;
1828  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;
1829  }
1830  case 93: {
1831  double t = 2*y100 - 187;
1832  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;
1833  }
1834  case 94: {
1835  double t = 2*y100 - 189;
1836  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;
1837  }
1838  case 95: {
1839  double t = 2*y100 - 191;
1840  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;
1841  }
1842  case 96: {
1843  double t = 2*y100 - 193;
1844  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;
1845  }
1846  case 97: case 98:
1847  case 99: case 100: { // use Taylor expansion for small x (|x| <= 0.0309...)
1848  // (2/sqrt(pi)) * (x - 2/3 x^3 + 4/15 x^5 - 8/105 x^7 + 16/945 x^9)
1849  double x2 = x*x;
1850  return x * (1.1283791670955125739
1851  - x2 * (0.75225277806367504925
1852  - x2 * (0.30090111122547001970
1853  - x2 * (0.085971746064420005629
1854  - x2 * 0.016931216931216931217))));
1855  }
1856  }
1857  /* Since 0 <= y100 < 101, this is only reached if x is NaN,
1858  in which case we should return NaN. */
1859  return NaN;
1860 }
1861 
1862 double FADDEEVA(w_im)(double x)
1863 {
1864  if (x >= 0) {
1865  if (x > 45) { // continued-fraction expansion is faster
1866  const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
1867  if (x > 5e7) // 1-term expansion, important to avoid overflow
1868  return ispi / x;
1869  /* 5-term expansion (rely on compiler for CSE), simplified from:
1870  ispi / (x-0.5/(x-1/(x-1.5/(x-2/x)))) */
1871  return ispi*((x*x) * (x*x-4.5) + 2) / (x * ((x*x) * (x*x-5) + 3.75));
1872  }
1873  return w_im_y100(100/(1+x), x);
1874  }
1875  else { // = -FADDEEVA(w_im)(-x)
1876  if (x < -45) { // continued-fraction expansion is faster
1877  const double ispi = 0.56418958354775628694807945156; // 1 / sqrt(pi)
1878  if (x < -5e7) // 1-term expansion, important to avoid overflow
1879  return ispi / x;
1880  /* 5-term expansion (rely on compiler for CSE), simplified from:
1881  ispi / (x-0.5/(x-1/(x-1.5/(x-2/x)))) */
1882  return ispi*((x*x) * (x*x-4.5) + 2) / (x * ((x*x) * (x*x-5) + 3.75));
1883  }
1884  return -w_im_y100(100/(1-x), -x);
1885  }
1886 }
1887 
1888 /////////////////////////////////////////////////////////////////////////
1889 
1890 // Compile with -DTEST_FADDEEVA to compile a little test program
1891 #ifdef TEST_FADDEEVA
1892 
1893 #ifdef __cplusplus
1894 # include <cstdio>
1895 #else
1896 # include <stdio.h>
1897 #endif
1898 
1899 // compute relative error |b-a|/|a|, handling case of NaN and Inf,
1900 static double relerr(double a, double b) {
1901  if (isnan(a) || isnan(b) || isinf(a) || isinf(b)) {
1902  if ((isnan(a) && !isnan(b)) || (!isnan(a) && isnan(b)) ||
1903  (isinf(a) && !isinf(b)) || (!isinf(a) && isinf(b)) ||
1904  (isinf(a) && isinf(b) && a*b < 0))
1905  return Inf; // "infinite" error
1906  return 0; // matching infinity/nan results counted as zero error
1907  }
1908  if (a == 0)
1909  return b == 0 ? 0 : Inf;
1910  else
1911  return fabs((b-a) / a);
1912 }
1913 
1914 int main(void) {
1915  double errmax_all = 0;
1916  {
1917  printf("############# w(z) tests #############\n");
1918 #define NTST 57 // define instead of const for C compatibility
1919  cmplx z[NTST] = {
1920  C(624.2,-0.26123),
1921  C(-0.4,3.),
1922  C(0.6,2.),
1923  C(-1.,1.),
1924  C(-1.,-9.),
1925  C(-1.,9.),
1926  C(-0.0000000234545,1.1234),
1927  C(-3.,5.1),
1928  C(-53,30.1),
1929  C(0.0,0.12345),
1930  C(11,1),
1931  C(-22,-2),
1932  C(9,-28),
1933  C(21,-33),
1934  C(1e5,1e5),
1935  C(1e14,1e14),
1936  C(-3001,-1000),
1937  C(1e160,-1e159),
1938  C(-6.01,0.01),
1939  C(-0.7,-0.7),
1940  C(2.611780000000000e+01, 4.540909610972489e+03),
1941  C(0.8e7,0.3e7),
1942  C(-20,-19.8081),
1943  C(1e-16,-1.1e-16),
1944  C(2.3e-8,1.3e-8),
1945  C(6.3,-1e-13),
1946  C(6.3,1e-20),
1947  C(1e-20,6.3),
1948  C(1e-20,16.3),
1949  C(9,1e-300),
1950  C(6.01,0.11),
1951  C(8.01,1.01e-10),
1952  C(28.01,1e-300),
1953  C(10.01,1e-200),
1954  C(10.01,-1e-200),
1955  C(10.01,0.99e-10),
1956  C(10.01,-0.99e-10),
1957  C(1e-20,7.01),
1958  C(-1,7.01),
1959  C(5.99,7.01),
1960  C(1,0),
1961  C(55,0),
1962  C(-0.1,0),
1963  C(1e-20,0),
1964  C(0,5e-14),
1965  C(0,51),
1966  C(Inf,0),
1967  C(-Inf,0),
1968  C(0,Inf),
1969  C(0,-Inf),
1970  C(Inf,Inf),
1971  C(Inf,-Inf),
1972  C(NaN,NaN),
1973  C(NaN,0),
1974  C(0,NaN),
1975  C(NaN,Inf),
1976  C(Inf,NaN)
1977  };
1978  cmplx w[NTST] = { /* w(z), computed with WolframAlpha
1979  ... note that WolframAlpha is problematic
1980  some of the above inputs, so I had to
1981  use the continued-fraction expansion
1982  in WolframAlpha in some cases, or switch
1983  to Maple */
1984  C(-3.78270245518980507452677445620103199303131110e-7,
1985  0.000903861276433172057331093754199933411710053155),
1986  C(0.1764906227004816847297495349730234591778719532788,
1987  -0.02146550539468457616788719893991501311573031095617),
1988  C(0.2410250715772692146133539023007113781272362309451,
1989  0.06087579663428089745895459735240964093522265589350),
1990  C(0.30474420525691259245713884106959496013413834051768,
1991  -0.20821893820283162728743734725471561394145872072738),
1992  C(7.317131068972378096865595229600561710140617977e34,
1993  8.321873499714402777186848353320412813066170427e34),
1994  C(0.0615698507236323685519612934241429530190806818395,
1995  -0.00676005783716575013073036218018565206070072304635),
1996  C(0.3960793007699874918961319170187598400134746631,
1997  -5.593152259116644920546186222529802777409274656e-9),
1998  C(0.08217199226739447943295069917990417630675021771804,
1999  -0.04701291087643609891018366143118110965272615832184),
2000  C(0.00457246000350281640952328010227885008541748668738,
2001  -0.00804900791411691821818731763401840373998654987934),
2002  C(0.8746342859608052666092782112565360755791467973338452,
2003  0.),
2004  C(0.00468190164965444174367477874864366058339647648741,
2005  0.0510735563901306197993676329845149741675029197050),
2006  C(-0.0023193175200187620902125853834909543869428763219,
2007  -0.025460054739731556004902057663500272721780776336),
2008  C(9.11463368405637174660562096516414499772662584e304,
2009  3.97101807145263333769664875189354358563218932e305),
2010  C(-4.4927207857715598976165541011143706155432296e281,
2011  -2.8019591213423077494444700357168707775769028e281),
2012  C(2.820947917809305132678577516325951485807107151e-6,
2013  2.820947917668257736791638444590253942253354058e-6),
2014  C(2.82094791773878143474039725787438662716372268e-15,
2015  2.82094791773878143474039725773333923127678361e-15),
2016  C(-0.0000563851289696244350147899376081488003110150498,
2017  -0.000169211755126812174631861529808288295454992688),
2018  C(-5.586035480670854326218608431294778077663867e-162,
2019  5.586035480670854326218608431294778077663867e-161),
2020  C(0.00016318325137140451888255634399123461580248456,
2021  -0.095232456573009287370728788146686162555021209999),
2022  C(0.69504753678406939989115375989939096800793577783885,
2023  -1.8916411171103639136680830887017670616339912024317),
2024  C(0.0001242418269653279656612334210746733213167234822,
2025  7.145975826320186888508563111992099992116786763e-7),
2026  C(2.318587329648353318615800865959225429377529825e-8,
2027  6.182899545728857485721417893323317843200933380e-8),
2028  C(-0.0133426877243506022053521927604277115767311800303,
2029  -0.0148087097143220769493341484176979826888871576145),
2030  C(1.00000000000000012412170838050638522857747934,
2031  1.12837916709551279389615890312156495593616433e-16),
2032  C(0.9999999853310704677583504063775310832036830015,
2033  2.595272024519678881897196435157270184030360773e-8),
2034  C(-1.4731421795638279504242963027196663601154624e-15,
2035  0.090727659684127365236479098488823462473074709),
2036  C(5.79246077884410284575834156425396800754409308e-18,
2037  0.0907276596841273652364790985059772809093822374),
2038  C(0.0884658993528521953466533278764830881245144368,
2039  1.37088352495749125283269718778582613192166760e-22),
2040  C(0.0345480845419190424370085249304184266813447878,
2041  2.11161102895179044968099038990446187626075258e-23),
2042  C(6.63967719958073440070225527042829242391918213e-36,
2043  0.0630820900592582863713653132559743161572639353),
2044  C(0.00179435233208702644891092397579091030658500743634,
2045  0.0951983814805270647939647438459699953990788064762),
2046  C(9.09760377102097999924241322094863528771095448e-13,
2047  0.0709979210725138550986782242355007611074966717),
2048  C(7.2049510279742166460047102593255688682910274423e-304,
2049  0.0201552956479526953866611812593266285000876784321),
2050  C(3.04543604652250734193622967873276113872279682e-44,
2051  0.0566481651760675042930042117726713294607499165),
2052  C(3.04543604652250734193622967873276113872279682e-44,
2053  0.0566481651760675042930042117726713294607499165),
2054  C(0.5659928732065273429286988428080855057102069081e-12,
2055  0.056648165176067504292998527162143030538756683302),
2056  C(-0.56599287320652734292869884280802459698927645e-12,
2057  0.0566481651760675042929985271621430305387566833029),
2058  C(0.0796884251721652215687859778119964009569455462,
2059  1.11474461817561675017794941973556302717225126e-22),
2060  C(0.07817195821247357458545539935996687005781943386550,
2061  -0.01093913670103576690766705513142246633056714279654),
2062  C(0.04670032980990449912809326141164730850466208439937,
2063  0.03944038961933534137558064191650437353429669886545),
2064  C(0.36787944117144232159552377016146086744581113103176,
2065  0.60715770584139372911503823580074492116122092866515),
2066  C(0,
2067  0.010259688805536830986089913987516716056946786526145),
2068  C(0.99004983374916805357390597718003655777207908125383,
2069  -0.11208866436449538036721343053869621153527769495574),
2070  C(0.99999999999999999999999999999999999999990000,
2071  1.12837916709551257389615890312154517168802603e-20),
2072  C(0.999999999999943581041645226871305192054749891144158,
2073  0),
2074  C(0.0110604154853277201542582159216317923453996211744250,
2075  0),
2076  C(0,0),
2077  C(0,0),
2078  C(0,0),
2079  C(Inf,0),
2080  C(0,0),
2081  C(NaN,NaN),
2082  C(NaN,NaN),
2083  C(NaN,NaN),
2084  C(NaN,0),
2085  C(NaN,NaN),
2086  C(NaN,NaN)
2087  };
2088  double errmax = 0;
2089  for (int i = 0; i < NTST; ++i) {
2090  cmplx fw = FADDEEVA(w)(z[i],0.);
2091  double re_err = relerr(creal(w[i]), creal(fw));
2092  double im_err = relerr(cimag(w[i]), cimag(fw));
2093  printf("w(%g%+gi) = %g%+gi (vs. %g%+gi), re/im rel. err. = %0.2g/%0.2g)\n",
2094  creal(z[i]),cimag(z[i]), creal(fw),cimag(fw), creal(w[i]),cimag(w[i]),
2095  re_err, im_err);
2096  if (re_err > errmax) errmax = re_err;
2097  if (im_err > errmax) errmax = im_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  {
2107 #undef NTST
2108 #define NTST 41 // define instead of const for C compatibility
2109  cmplx z[NTST] = {
2110  C(1,2),
2111  C(-1,2),
2112  C(1,-2),
2113  C(-1,-2),
2114  C(9,-28),
2115  C(21,-33),
2116  C(1e3,1e3),
2117  C(-3001,-1000),
2118  C(1e160,-1e159),
2119  C(5.1e-3, 1e-8),
2120  C(-4.9e-3, 4.95e-3),
2121  C(4.9e-3, 0.5),
2122  C(4.9e-4, -0.5e1),
2123  C(-4.9e-5, -0.5e2),
2124  C(5.1e-3, 0.5),
2125  C(5.1e-4, -0.5e1),
2126  C(-5.1e-5, -0.5e2),
2127  C(1e-6,2e-6),
2128  C(0,2e-6),
2129  C(0,2),
2130  C(0,20),
2131  C(0,200),
2132  C(Inf,0),
2133  C(-Inf,0),
2134  C(0,Inf),
2135  C(0,-Inf),
2136  C(Inf,Inf),
2137  C(Inf,-Inf),
2138  C(NaN,NaN),
2139  C(NaN,0),
2140  C(0,NaN),
2141  C(NaN,Inf),
2142  C(Inf,NaN),
2143  C(1e-3,NaN),
2144  C(7e-2,7e-2),
2145  C(7e-2,-7e-4),
2146  C(-9e-2,7e-4),
2147  C(-9e-2,9e-2),
2148  C(-7e-4,9e-2),
2149  C(7e-2,0.9e-2),
2150  C(7e-2,1.1e-2)
2151  };
2152  cmplx w[NTST] = { // erf(z[i]), evaluated with Maple
2153  C(-0.5366435657785650339917955593141927494421,
2154  -5.049143703447034669543036958614140565553),
2155  C(0.5366435657785650339917955593141927494421,
2156  -5.049143703447034669543036958614140565553),
2157  C(-0.5366435657785650339917955593141927494421,
2158  5.049143703447034669543036958614140565553),
2159  C(0.5366435657785650339917955593141927494421,
2160  5.049143703447034669543036958614140565553),
2161  C(0.3359473673830576996788000505817956637777e304,
2162  -0.1999896139679880888755589794455069208455e304),
2163  C(0.3584459971462946066523939204836760283645e278,
2164  0.3818954885257184373734213077678011282505e280),
2165  C(0.9996020422657148639102150147542224526887,
2166  0.00002801044116908227889681753993542916894856),
2167  C(-1, 0),
2168  C(1, 0),
2169  C(0.005754683859034800134412990541076554934877,
2170  0.1128349818335058741511924929801267822634e-7),
2171  C(-0.005529149142341821193633460286828381876955,
2172  0.005585388387864706679609092447916333443570),
2173  C(0.007099365669981359632319829148438283865814,
2174  0.6149347012854211635026981277569074001219),
2175  C(0.3981176338702323417718189922039863062440e8,
2176  -0.8298176341665249121085423917575122140650e10),
2177  C(-Inf,
2178  -Inf),
2179  C(0.007389128308257135427153919483147229573895,
2180  0.6149332524601658796226417164791221815139),
2181  C(0.4143671923267934479245651547534414976991e8,
2182  -0.8298168216818314211557046346850921446950e10),
2183  C(-Inf,
2184  -Inf),
2185  C(0.1128379167099649964175513742247082845155e-5,
2186  0.2256758334191777400570377193451519478895e-5),
2187  C(0,
2188  0.2256758334194034158904576117253481476197e-5),
2189  C(0,
2190  18.56480241457555259870429191324101719886),
2191  C(0,
2192  0.1474797539628786202447733153131835124599e173),
2193  C(0,
2194  Inf),
2195  C(1,0),
2196  C(-1,0),
2197  C(0,Inf),
2198  C(0,-Inf),
2199  C(NaN,NaN),
2200  C(NaN,NaN),
2201  C(NaN,NaN),
2202  C(NaN,0),
2203  C(0,NaN),
2204  C(NaN,NaN),
2205  C(NaN,NaN),
2206  C(NaN,NaN),
2207  C(0.07924380404615782687930591956705225541145,
2208  0.07872776218046681145537914954027729115247),
2209  C(0.07885775828512276968931773651224684454495,
2210  -0.0007860046704118224342390725280161272277506),
2211  C(-0.1012806432747198859687963080684978759881,
2212  0.0007834934747022035607566216654982820299469),
2213  C(-0.1020998418798097910247132140051062512527,
2214  0.1010030778892310851309082083238896270340),
2215  C(-0.0007962891763147907785684591823889484764272,
2216  0.1018289385936278171741809237435404896152),
2217  C(0.07886408666470478681566329888615410479530,
2218  0.01010604288780868961492224347707949372245),
2219  C(0.07886723099940260286824654364807981336591,
2220  0.01235199327873258197931147306290916629654)
2221  };
2222 #define TST(f,isc) \
2223  printf("############# " #f "(z) tests #############\n"); \
2224  double errmax = 0; \
2225  for (int i = 0; i < NTST; ++i) { \
2226  cmplx fw = FADDEEVA(f)(z[i],0.); \
2227  double re_err = relerr(creal(w[i]), creal(fw)); \
2228  double im_err = relerr(cimag(w[i]), cimag(fw)); \
2229  printf(#f "(%g%+gi) = %g%+gi (vs. %g%+gi), re/im rel. err. = %0.2g/%0.2g)\n", \
2230  creal(z[i]),cimag(z[i]), creal(fw),cimag(fw), creal(w[i]),cimag(w[i]), \
2231  re_err, im_err); \
2232  if (re_err > errmax) errmax = re_err; \
2233  if (im_err > errmax) errmax = im_err; \
2234  } \
2235  if (errmax > 1e-13) { \
2236  printf("FAILURE -- relative error %g too large!\n", errmax); \
2237  return 1; \
2238  } \
2239  printf("Checking " #f "(x) special case...\n"); \
2240  for (int i = 0; i < 10000; ++i) { \
2241  double x = pow(10., -300. + i * 600. / (10000 - 1)); \
2242  double re_err = relerr(FADDEEVA_RE(f)(x), \
2243  creal(FADDEEVA(f)(C(x,x*isc),0.))); \
2244  if (re_err > errmax) errmax = re_err; \
2245  re_err = relerr(FADDEEVA_RE(f)(-x), \
2246  creal(FADDEEVA(f)(C(-x,x*isc),0.))); \
2247  if (re_err > errmax) errmax = re_err; \
2248  } \
2249  { \
2250  double re_err = relerr(FADDEEVA_RE(f)(Inf), \
2251  creal(FADDEEVA(f)(C(Inf,0.),0.))); \
2252  if (re_err > errmax) errmax = re_err; \
2253  re_err = relerr(FADDEEVA_RE(f)(-Inf), \
2254  creal(FADDEEVA(f)(C(-Inf,0.),0.))); \
2255  if (re_err > errmax) errmax = re_err; \
2256  re_err = relerr(FADDEEVA_RE(f)(NaN), \
2257  creal(FADDEEVA(f)(C(NaN,0.),0.))); \
2258  if (re_err > errmax) errmax = re_err; \
2259  } \
2260  if (errmax > 1e-13) { \
2261  printf("FAILURE -- relative error %g too large!\n", errmax); \
2262  return 1; \
2263  } \
2264  printf("SUCCESS (max relative error = %g)\n", errmax); \
2265  if (errmax > errmax_all) errmax_all = errmax
2266 
2267  TST(erf, 1e-20);
2268  }
2269  {
2270  // since erfi just calls through to erf, just one test should
2271  // be sufficient to make sure I didn't screw up the signs or something
2272 #undef NTST
2273 #define NTST 1 // define instead of const for C compatibility
2274  cmplx z[NTST] = { C(1.234,0.5678) };
2275  cmplx w[NTST] = { // erfi(z[i]), computed with Maple
2276  C(1.081032284405373149432716643834106923212,
2277  1.926775520840916645838949402886591180834)
2278  };
2279  TST(erfi, 0);
2280  }
2281  {
2282  // since erfcx just calls through to w, just one test should
2283  // be sufficient to make sure I didn't screw up the signs or something
2284 #undef NTST
2285 #define NTST 1 // define instead of const for C compatibility
2286  cmplx z[NTST] = { C(1.234,0.5678) };
2287  cmplx w[NTST] = { // erfcx(z[i]), computed with Maple
2288  C(0.3382187479799972294747793561190487832579,
2289  -0.1116077470811648467464927471872945833154)
2290  };
2291  TST(erfcx, 0);
2292  }
2293  {
2294 #undef NTST
2295 #define NTST 30 // define instead of const for C compatibility
2296  cmplx z[NTST] = {
2297  C(1,2),
2298  C(-1,2),
2299  C(1,-2),
2300  C(-1,-2),
2301  C(9,-28),
2302  C(21,-33),
2303  C(1e3,1e3),
2304  C(-3001,-1000),
2305  C(1e160,-1e159),
2306  C(5.1e-3, 1e-8),
2307  C(0,2e-6),
2308  C(0,2),
2309  C(0,20),
2310  C(0,200),
2311  C(2e-6,0),
2312  C(2,0),
2313  C(20,0),
2314  C(200,0),
2315  C(Inf,0),
2316  C(-Inf,0),
2317  C(0,Inf),
2318  C(0,-Inf),
2319  C(Inf,Inf),
2320  C(Inf,-Inf),
2321  C(NaN,NaN),
2322  C(NaN,0),
2323  C(0,NaN),
2324  C(NaN,Inf),
2325  C(Inf,NaN),
2326  C(88,0)
2327  };
2328  cmplx w[NTST] = { // erfc(z[i]), evaluated with Maple
2329  C(1.536643565778565033991795559314192749442,
2330  5.049143703447034669543036958614140565553),
2331  C(0.4633564342214349660082044406858072505579,
2332  5.049143703447034669543036958614140565553),
2333  C(1.536643565778565033991795559314192749442,
2334  -5.049143703447034669543036958614140565553),
2335  C(0.4633564342214349660082044406858072505579,
2336  -5.049143703447034669543036958614140565553),
2337  C(-0.3359473673830576996788000505817956637777e304,
2338  0.1999896139679880888755589794455069208455e304),
2339  C(-0.3584459971462946066523939204836760283645e278,
2340  -0.3818954885257184373734213077678011282505e280),
2341  C(0.0003979577342851360897849852457775473112748,
2342  -0.00002801044116908227889681753993542916894856),
2343  C(2, 0),
2344  C(0, 0),
2345  C(0.9942453161409651998655870094589234450651,
2346  -0.1128349818335058741511924929801267822634e-7),
2347  C(1,
2348  -0.2256758334194034158904576117253481476197e-5),
2349  C(1,
2350  -18.56480241457555259870429191324101719886),
2351  C(1,
2352  -0.1474797539628786202447733153131835124599e173),
2353  C(1, -Inf),
2354  C(0.9999977432416658119838633199332831406314,
2355  0),
2356  C(0.004677734981047265837930743632747071389108,
2357  0),
2358  C(0.5395865611607900928934999167905345604088e-175,
2359  0),
2360  C(0, 0),
2361  C(0, 0),
2362  C(2, 0),
2363  C(1, -Inf),
2364  C(1, Inf),
2365  C(NaN, NaN),
2366  C(NaN, NaN),
2367  C(NaN, NaN),
2368  C(NaN, 0),
2369  C(1, NaN),
2370  C(NaN, NaN),
2371  C(NaN, NaN),
2372  C(0,0)
2373  };
2374  TST(erfc, 1e-20);
2375  }
2376  {
2377 #undef NTST
2378 #define NTST 48 // define instead of const for C compatibility
2379  cmplx z[NTST] = {
2380  C(2,1),
2381  C(-2,1),
2382  C(2,-1),
2383  C(-2,-1),
2384  C(-28,9),
2385  C(33,-21),
2386  C(1e3,1e3),
2387  C(-1000,-3001),
2388  C(1e-8, 5.1e-3),
2389  C(4.95e-3, -4.9e-3),
2390  C(5.1e-3, 5.1e-3),
2391  C(0.5, 4.9e-3),
2392  C(-0.5e1, 4.9e-4),
2393  C(-0.5e2, -4.9e-5),
2394  C(0.5e3, 4.9e-6),
2395  C(0.5, 5.1e-3),
2396  C(-0.5e1, 5.1e-4),
2397  C(-0.5e2, -5.1e-5),
2398  C(1e-6,2e-6),
2399  C(2e-6,0),
2400  C(2,0),
2401  C(20,0),
2402  C(200,0),
2403  C(0,4.9e-3),
2404  C(0,-5.1e-3),
2405  C(0,2e-6),
2406  C(0,-2),
2407  C(0,20),
2408  C(0,-200),
2409  C(Inf,0),
2410  C(-Inf,0),
2411  C(0,Inf),
2412  C(0,-Inf),
2413  C(Inf,Inf),
2414  C(Inf,-Inf),
2415  C(NaN,NaN),
2416  C(NaN,0),
2417  C(0,NaN),
2418  C(NaN,Inf),
2419  C(Inf,NaN),
2420  C(39, 6.4e-5),
2421  C(41, 6.09e-5),
2422  C(4.9e7, 5e-11),
2423  C(5.1e7, 4.8e-11),
2424  C(1e9, 2.4e-12),
2425  C(1e11, 2.4e-14),
2426  C(1e13, 2.4e-16),
2427  C(1e300, 2.4e-303)
2428  };
2429  cmplx w[NTST] = { // dawson(z[i]), evaluated with Maple
2430  C(0.1635394094345355614904345232875688576839,
2431  -0.1531245755371229803585918112683241066853),
2432  C(-0.1635394094345355614904345232875688576839,
2433  -0.1531245755371229803585918112683241066853),
2434  C(0.1635394094345355614904345232875688576839,
2435  0.1531245755371229803585918112683241066853),
2436  C(-0.1635394094345355614904345232875688576839,
2437  0.1531245755371229803585918112683241066853),
2438  C(-0.01619082256681596362895875232699626384420,
2439  -0.005210224203359059109181555401330902819419),
2440  C(0.01078377080978103125464543240346760257008,
2441  0.006866888783433775382193630944275682670599),
2442  C(-0.5808616819196736225612296471081337245459,
2443  0.6688593905505562263387760667171706325749),
2444  C(Inf,
2445  -Inf),
2446  C(0.1000052020902036118082966385855563526705e-7,
2447  0.005100088434920073153418834680320146441685),
2448  C(0.004950156837581592745389973960217444687524,
2449  -0.004899838305155226382584756154100963570500),
2450  C(0.005100176864319675957314822982399286703798,
2451  0.005099823128319785355949825238269336481254),
2452  C(0.4244534840871830045021143490355372016428,
2453  0.002820278933186814021399602648373095266538),
2454  C(-0.1021340733271046543881236523269967674156,
2455  -0.00001045696456072005761498961861088944159916),
2456  C(-0.01000200120119206748855061636187197886859,
2457  0.9805885888237419500266621041508714123763e-8),
2458  C(0.001000002000012000023960527532953151819595,
2459  -0.9800058800588007290937355024646722133204e-11),
2460  C(0.4244549085628511778373438768121222815752,
2461  0.002935393851311701428647152230552122898291),
2462  C(-0.1021340732357117208743299813648493928105,
2463  -0.00001088377943049851799938998805451564893540),
2464  C(-0.01000200120119126652710792390331206563616,
2465  0.1020612612857282306892368985525393707486e-7),
2466  C(0.1000000000007333333333344266666666664457e-5,
2467  0.2000000000001333333333323199999999978819e-5),
2468  C(0.1999999999994666666666675199999999990248e-5,
2469  0),
2470  C(0.3013403889237919660346644392864226952119,
2471  0),
2472  C(0.02503136792640367194699495234782353186858,
2473  0),
2474  C(0.002500031251171948248596912483183760683918,
2475  0),
2476  C(0,0.004900078433419939164774792850907128053308),
2477  C(0,-0.005100088434920074173454208832365950009419),
2478  C(0,0.2000000000005333333333341866666666676419e-5),
2479  C(0,-48.16001211429122974789822893525016528191),
2480  C(0,0.4627407029504443513654142715903005954668e174),
2481  C(0,-Inf),
2482  C(0,0),
2483  C(-0,0),
2484  C(0, Inf),
2485  C(0, -Inf),
2486  C(NaN, NaN),
2487  C(NaN, NaN),
2488  C(NaN, NaN),
2489  C(NaN, 0),
2490  C(0, NaN),
2491  C(NaN, NaN),
2492  C(NaN, NaN),
2493  C(0.01282473148489433743567240624939698290584,
2494  -0.2105957276516618621447832572909153498104e-7),
2495  C(0.01219875253423634378984109995893708152885,
2496  -0.1813040560401824664088425926165834355953e-7),
2497  C(0.1020408163265306334945473399689037886997e-7,
2498  -0.1041232819658476285651490827866174985330e-25),
2499  C(0.9803921568627452865036825956835185367356e-8,
2500  -0.9227220299884665067601095648451913375754e-26),
2501  C(0.5000000000000000002500000000000000003750e-9,
2502  -0.1200000000000000001800000188712838420241e-29),
2503  C(5.00000000000000000000025000000000000000000003e-12,
2504  -1.20000000000000000000018000000000000000000004e-36),
2505  C(5.00000000000000000000000002500000000000000000e-14,
2506  -1.20000000000000000000000001800000000000000000e-42),
2507  C(5e-301, 0)
2508  };
2509  TST(Dawson, 1e-20);
2510  }
2511  printf("#####################################\n");
2512  printf("SUCCESS (max relative error = %g)\n", errmax_all);
2513 }
2514 
2515 #endif