Hmm... what exactly is the erf defined as?
Is this related to the area of one tail of a gaussian distribution (or can it be rewritten as such)?
There is no ANSI C stuff to handle this -- but the attached code can be used to get the area of a tail (UT for upper tail, LT for lower) of the standard normal gaussian curve.
Code:
double probZUT(double z){
/*
Probability that a standard normal random variable has value >= z
(i.e. the area under the standard normal curve for Z in [z,+inf]
Originally adapted by Gary Perlman from a polynomial approximation in:
Ibbetson D, Algorithm 209
Collected Algorithms of the CACM 1963 p. 616
Adapted (returns upper tail instead of lower tail)
This function is not copyrighted
*/
double y, x, w;
if (z == 0.0)
x = 0.0;
else{
y = 0.5 * fabs (z);
if (y >= (Z_MAX * 0.5))
x = 1.0;
else if (y < 1.0){
w = y*y;
x = ((((((((0.000124818987 * w
-0.001075204047) * w +0.005198775019) * w
-0.019198292004) * w +0.059054035642) * w
-0.151968751364) * w +0.319152932694) * w
-0.531923007300) * w +0.797884560593) * y * 2.0;
}
else{
y -= 2.0;
x = (((((((((((((-0.000045255659 * y
+0.000152529290) * y -0.000019538132) * y
-0.000676904986) * y +0.001390604284) * y
-0.000794620820) * y -0.002034254874) * y
+0.006549791214) * y -0.010557625006) * y
+0.011630447319) * y -0.009279453341) * y
+0.005353579108) * y -0.002141268741) * y
+0.000535310849) * y +0.999936657524;
}
}
return (z < 0.0 ? ((x + 1.0) * 0.5) : ((1.0 - x) * 0.5));
}
double probZLT(double z){
return 1.0 - probZUT(z);
}