Las implementaciones de la CDF normal dada aquí son precisión simple aproximaciones que han tenido float
sustituye con double
y por lo tanto sólo son precisos a 7 u 8 cifras significativas (decimal).
Para una implementación de VB de doble precisión de Hart aproximación, vea la figura 2 de West Better approximations to cumulative normal functions.
Editar: Mi traducción de aplicación de Occidente en C++:
double
phi(double x)
{
static const double RT2PI = sqrt(4.0*acos(0.0));
static const double SPLIT = 7.07106781186547;
static const double N0 = 220.206867912376;
static const double N1 = 221.213596169931;
static const double N2 = 112.079291497871;
static const double N3 = 33.912866078383;
static const double N4 = 6.37396220353165;
static const double N5 = 0.700383064443688;
static const double N6 = 3.52624965998911e-02;
static const double M0 = 440.413735824752;
static const double M1 = 793.826512519948;
static const double M2 = 637.333633378831;
static const double M3 = 296.564248779674;
static const double M4 = 86.7807322029461;
static const double M5 = 16.064177579207;
static const double M6 = 1.75566716318264;
static const double M7 = 8.83883476483184e-02;
const double z = fabs(x);
double c = 0.0;
if(z<=37.0)
{
const double e = exp(-z*z/2.0);
if(z<SPLIT)
{
const double n = (((((N6*z + N5)*z + N4)*z + N3)*z + N2)*z + N1)*z + N0;
const double d = ((((((M7*z + M6)*z + M5)*z + M4)*z + M3)*z + M2)*z + M1)*z + M0;
c = e*n/d;
}
else
{
const double f = z + 1.0/(z + 2.0/(z + 3.0/(z + 4.0/(z + 13.0/20.0))));
c = e/(RT2PI*f);
}
}
return x<=0.0 ? c : 1-c;
}
Tenga en cuenta que he reordenado expresiones en las formas más familiares para las series y las continuas aproximaciones de fracciones. El último número mágico en el código de West es la raíz cuadrada de 2 π, que he diferido al compilador en la primera línea explotando la identidad acos (0) = & frac12; π.
He comprobado tres veces los números mágicos, pero siempre existe la posibilidad de que haya escrito mal algo. Si detecta un error tipográfico, ¡por favor coméntelo!
Los resultados de los datos de prueba, John Cook, utilizó en su respuesta son
x phi Mathematica
-3 1.3498980316301150e-003 0.00134989803163
-1 1.5865525393145702e-001 0.158655253931
0 5.0000000000000000e-001 0.5
0.5 6.9146246127401301e-001 0.691462461274
2.1 9.8213557943718344e-001 0.982135579437
que tomar algún consuelo en el hecho de que están de acuerdo con todos los dígitos dados por los resultados de Mathematica.
Si el CDF de la distribución normal es todo lo que necesita, ¿por qué no simplemente implementarlo usted mismo? No contiene magia, por lo que su implementación es sencilla. –