picomath

PHP

normal_cdf_inverse.php

<?

function rational_approximation($t) {
    # Abramowitz and Stegun formula 26.2.23.
    # The absolute value of the error should be less than 4.5 e-4.
    $c = array(2.515517, 0.802853, 0.010328);
    $d = array(1.432788, 0.189269, 0.001308);
    $numerator = ($c[2]*$t + $c[1])*$t + $c[0];
    $denominator = (($d[2]*$t + $d[1])*$t + $d[0])*$t + 1.0;
    return $t - $numerator / $denominator;
}


function normal_cdf_inverse($p) {
    # See article above for explanation of this section.
    if ($p < 0.5) {
        # F^-1(p) = - G^-1(p)
        return -rational_approximation( sqrt(-2.0*log($p)) );
    } else {
        # F^-1(p) = G^-1(1-p)
        return rational_approximation( sqrt(-2.0*log(1.0-$p)) );
    }
}

?>