On Mar 10, 2006, at 3:18 AM, Paul Rehill wrote:

One more question.  Do you have a good function for the inverse of the
standard normal cumulative distribution?

Function InvCumNormDist(p as Double, Mean as Double = 0.0, StdDev as Double = 1.0) As Double

  Const a1= -3.969683028665376e+01
  Const a2=  2.209460984245205e+02
  Const a3= -2.759285104469687e+02
  Const a4=  1.383577518672690e+02
  Const a5= -3.066479806614716e+01
  Const a6=  2.506628277459239e+00

  Const b1= -5.447609879822406e+01
  Const b2=  1.615858368580409e+02
  Const b3= -1.556989798598866e+02
  Const b4=  6.680131188771972e+01
  Const b5= -1.328068155288572e+01

  Const c1= -7.784894002430293e-03
  Const c2= -3.223964580411365e-01
  Const c3= -2.400758277161838e+00
  Const c4= -2.549732539343734e+00
  Const c5=  4.374664141464968e+00
  Const c6=  2.938163982698783e+00

  Const d1=  7.784695709041462e-03
  Const d2=  3.224671290700398e-01
  Const d3=  2.445134137142996e+00
  Const d4=  3.754408661907416e+00
  Const Sqrt_2Pi = 2.5066282746310

  Const p_low = 0.02425
  Const p_high= 0.97575

  Dim z, r as Double
  if p < 0.0 or p >= 1.0 Then Return - 1

  if p < p_low then
    z = Sqrt(-2.0*Ln(p))
z = (((((c1*z+c2)*z+c3)*z+c4)*z+c5)*z+c6) / ((((d1*z+d2)*z+d3)*z +d4)*z+1.0)
     elseif p <= p_high then

    z = p - 0.5
    r = z*z
z = (((((a1*r+a2)*r+a3)*r+a4)*r+a5)*r+a6)*z /(((((b1*r+b2)*r+b3) *r+b4)*r+b5)*r+1.0)
  else
    z = Sqrt(-2.0*Ln(1.0-p))
z = -(((((c1*z+c2)*z+c3)*z+c4)*z+c5)*z+c6) /((((d1*z+d2)*z+d3)*z +d4)*z+1.0)
  End if

  r = (CumNormalDist(z) - p) * Sqrt_2Pi * Exp(0.5 * z*z)

  z = z - ( r/(1+0.5*z*r))

  return mean + z*StdDev
End Function
'----------------------------------------------------------------------- ------------------- Function CumNormalDist(Z as Double, Mean as Double = 0.0, StdDev as Double = 1.0) As Double
  Const a1 = 0.31938153
  Const a2 = -0.356563782
  Const a3 = 1.781477937
  Const a4 = -1.821255978
  Const a5 = 1.330274429
  Const Sqrt_2Pi = 2.5066282746310

  Dim K, w As double , isNegative as boolean

  z = (z - Mean)/StdDev
  if z < 0.0 then
    isNegative = true
    z = Abs(z)
  End if

  K = 1.0 / (1.0 + 0.2316419 * z)
w= 1.0 - 1.0 /Sqrt_2Pi * Exp(-z * z / 2.0) * (a1 * K + a2 * K*K + a3 * Pow(K, 3) + a4 * Pow(K , 4) + a5 * Pow(K, 5))

  If isNegative Then w = 1.0 - w

  Return w
End Function

_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>

Reply via email to