You are here

private static function PHPExcel_Calculation_Statistical::_inverse_ncdf in Loft Data Grids 7.2

Same name and namespace in other branches
  1. 6.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Calculation/Statistical.php \PHPExcel_Calculation_Statistical::_inverse_ncdf()
1 call to PHPExcel_Calculation_Statistical::_inverse_ncdf()
PHPExcel_Calculation_Statistical::NORMINV in vendor/phpoffice/phpexcel/Classes/PHPExcel/Calculation/Statistical.php
* NORMINV * * Returns the inverse of the normal cumulative distribution for the specified mean and standard deviation. * *

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Calculation/Statistical.php, line 474

Class

PHPExcel_Calculation_Statistical
PHPExcel_Calculation_Statistical

Code

private static function _inverse_ncdf($p) {

  //	Inverse ncdf approximation by Peter J. Acklam, implementation adapted to
  //	PHP by Michael Nickerson, using Dr. Thomas Ziegler's C implementation as
  //	a guide. http://home.online.no/~pjacklam/notes/invnorm/index.html
  //	I have not checked the accuracy of this implementation. Be aware that PHP
  //	will truncate the coeficcients to 14 digits.
  //	You have permission to use and distribute this function freely for
  //	whatever purpose you want, but please show common courtesy and give credit
  //	where credit is due.
  //	Input paramater is $p - probability - where 0 < p < 1.
  //	Coefficients in rational approximations
  static $a = array(
    1 => -39.69683028665376,
    2 => 220.9460984245205,
    3 => -275.9285104469687,
    4 => 138.357751867269,
    5 => -30.66479806614716,
    6 => 2.506628277459239,
  );
  static $b = array(
    1 => -54.47609879822406,
    2 => 161.5858368580409,
    3 => -155.6989798598866,
    4 => 66.80131188771972,
    5 => -13.28068155288572,
  );
  static $c = array(
    1 => -0.007784894002430293,
    2 => -0.3223964580411365,
    3 => -2.400758277161838,
    4 => -2.549732539343734,
    5 => 4.374664141464968,
    6 => 2.938163982698783,
  );
  static $d = array(
    1 => 0.007784695709041462,
    2 => 0.3224671290700398,
    3 => 2.445134137142996,
    4 => 3.754408661907416,
  );

  //	Define lower and upper region break-points.
  $p_low = 0.02425;

  //Use lower region approx. below this
  $p_high = 1 - $p_low;

  //Use upper region approx. above this
  if (0 < $p && $p < $p_low) {

    //	Rational approximation for lower region.
    $q = sqrt(-2 * log($p));
    return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1);
  }
  elseif ($p_low <= $p && $p <= $p_high) {

    //	Rational approximation for central region.
    $q = $p - 0.5;
    $r = $q * $q;
    return ((((($a[1] * $r + $a[2]) * $r + $a[3]) * $r + $a[4]) * $r + $a[5]) * $r + $a[6]) * $q / ((((($b[1] * $r + $b[2]) * $r + $b[3]) * $r + $b[4]) * $r + $b[5]) * $r + 1);
  }
  elseif ($p_high < $p && $p < 1) {

    //	Rational approximation for upper region.
    $q = sqrt(-2 * log(1 - $p));
    return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1);
  }

  //	If 0 < p < 1, return a null value
  return PHPExcel_Calculation_Functions::NULL();
}