123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //-----------------------------------------------------------------------------
- //
- // Author : philippe.billet@noos.fr
- //
- // erfc(x)
- //
- // GW Added erfc() from Numerical Recipes in C
- //
- //-----------------------------------------------------------------------------
- #include "stdafx.h"
- #include "defs.h"
- static void yyerfc(void);
- void
- eval_erfc(void)
- {
- push(cadr(p1));
- eval();
- yerfc();
- }
- void
- yerfc(void)
- {
- save();
- yyerfc();
- restore();
- }
- static void
- yyerfc(void)
- {
- double d;
- p1 = pop();
- if (isdouble(p1)) {
- d = erfc(p1->u.d);
- push_double(d);
- return;
- }
- push_symbol(ERFC);
- push(p1);
- list(2);
- return;
- }
- // from Numerical Recipes in C
- #ifndef LINUX
- double
- erfc(double x)
- {
- double t, z, ans;
- z = fabs(x);
- t = 1.0 / (1.0 + 0.5 * z);
- ans=t*exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
- t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
- t*(-0.82215223+t*0.17087277)))))))));
- return x >= 0.0 ? ans : 2.0-ans;
- }
- #endif
- #if SELFTEST
- static char *s[] = {
- "erfc(a)",
- "erfc(a)",
- "erfc(0.0)",
- "1",
- "float(erfc(0))",
- "1",
- #if 0
- "float(erfc(1))",
- "0.157299",
- #endif
- };
- void
- test_erfc(void)
- {
- test(__FILE__, s, sizeof s / sizeof (char *));
- }
- #endif
|