83 lines
1004 B
C++
83 lines
1004 B
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// Author : philippe.billet@noos.fr
|
|
//
|
|
// Error function erf(x)
|
|
// erf(-x)=erf(x)
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "defs.h"
|
|
static void yyerf(void);
|
|
|
|
void
|
|
eval_erf(void)
|
|
{
|
|
push(cadr(p1));
|
|
eval();
|
|
yerf();
|
|
}
|
|
|
|
void
|
|
yerf(void)
|
|
{
|
|
save();
|
|
yyerf();
|
|
restore();
|
|
}
|
|
|
|
static void
|
|
yyerf(void)
|
|
{
|
|
double d;
|
|
|
|
p1 = pop();
|
|
|
|
if (isdouble(p1)) {
|
|
d = 1.0 - erfc(p1->u.d);
|
|
push_double(d);
|
|
return;
|
|
}
|
|
|
|
if (isnegativeterm(p1)) {
|
|
push_symbol(ERF);
|
|
push(p1);
|
|
negate();
|
|
list(2);
|
|
negate();
|
|
return;
|
|
}
|
|
|
|
push_symbol(ERF);
|
|
push(p1);
|
|
list(2);
|
|
return;
|
|
}
|
|
|
|
#if SELFTEST
|
|
|
|
static char *s[] = {
|
|
|
|
"erf(a)",
|
|
"erf(a)",
|
|
|
|
"erf(0.0) + 1", // add 1 to round off
|
|
"1",
|
|
|
|
"float(erf(0)) + 1", // add 1 to round off
|
|
"1",
|
|
#if 0
|
|
"float(erf(1))",
|
|
"0.842701",
|
|
#endif
|
|
};
|
|
|
|
void
|
|
test_erf(void)
|
|
{
|
|
test(__FILE__, s, sizeof s / sizeof (char *));
|
|
}
|
|
|
|
#endif
|