# Stand-alone C++ implementation of the error function erf(x)

The following code first appeared as Python code in my blog post Stand-alone error function erf. See that post for documentation. See also Relating erf and Φ.

```#include <cmath>

double erf(double x)
{
// constants
double a1 =  0.254829592;
double a2 = -0.284496736;
double a3 =  1.421413741;
double a4 = -1.453152027;
double a5 =  1.061405429;
double p  =  0.3275911;

// Save the sign of x
int sign = 1;
if (x < 0)
sign = -1;
x = fabs(x);

// A&S formula 7.1.26
double t = 1.0/(1.0 + p*x);
double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);

return sign*y;
}

void testErf()
{
// Select a few input values
double x[] =
{
-3,
-1,
0.0,
0.5,
2.1
};

// Output computed by Mathematica
// y = Erf[x]
double y[] =
{
-0.999977909503,
-0.842700792950,
0.0,
0.520499877813,
0.997020533344
};

int numTests = sizeof(x)/sizeof(double);

double maxError = 0.0;
for (int i = 0; i < numTests; ++i)     {
double error = fabs(y[i] - erf(x[i]));
if (error > maxError)
maxError = error;
}

std::cout << "Maximum error: " << maxError << "\n";
}
```

A&S refers to Handbook of Mathematical Functions by Abramowitz and Stegun. See Stand-alone error function for details of the algorithm.

This code is in the public domain. Do whatever you want with it, no strings attached.

Other versions: C#, Python 