Browse Source

GammaRegularized: minor code cleanup

v2
Christoph Ruegg 13 years ago
parent
commit
3601b704e3
  1. 29
      src/Numerics/SpecialFunctions/Gamma.cs

29
src/Numerics/SpecialFunctions/Gamma.cs

@ -162,20 +162,18 @@ namespace MathNet.Numerics
/// <returns>The upper incomplete regularized gamma function.</returns> /// <returns>The upper incomplete regularized gamma function.</returns>
public static double GammaUpperRegularized(double a, double x) public static double GammaUpperRegularized(double a, double x)
{ {
double t; const double Epsilon = 0.000000000000001;
const double BigNumber = 4503599627370496.0;
const double igammaepsilon = 0.000000000000001; const double BigNumberInverse = 2.22044604925031308085e-16;
const double igammabignumber = 4503599627370496.0;
const double igammabignumberinv = 2.22044604925031308085 * 0.0000000000000001;
if (x <= 0 | a <= 0) if (x <= 0d || a <= 0d)
{ {
return 1; return 1d;
} }
if (x < 1 | x < a) if (x < 1d || x < a)
{ {
return 1 - GammaLowerRegularized(a, x); return 1d - GammaLowerRegularized(a, x);
} }
double ax = a * Math.Log(x) - x - GammaLn(a); double ax = a * Math.Log(x) - x - GammaLn(a);
@ -185,6 +183,7 @@ namespace MathNet.Numerics
} }
ax = Math.Exp(ax); ax = Math.Exp(ax);
double t;
double y = 1 - a; double y = 1 - a;
double z = x + y + 1; double z = x + y + 1;
double c = 0; double c = 0;
@ -217,15 +216,15 @@ namespace MathNet.Numerics
qkm2 = qkm1; qkm2 = qkm1;
qkm1 = qk; qkm1 = qk;
if (Math.Abs(pk) > igammabignumber) if (Math.Abs(pk) > BigNumber)
{ {
pkm2 = pkm2 * igammabignumberinv; pkm2 = pkm2 * BigNumberInverse;
pkm1 = pkm1 * igammabignumberinv; pkm1 = pkm1 * BigNumberInverse;
qkm2 = qkm2 * igammabignumberinv; qkm2 = qkm2 * BigNumberInverse;
qkm1 = qkm1 * igammabignumberinv; qkm1 = qkm1 * BigNumberInverse;
} }
} }
while (t > igammaepsilon); while (t > Epsilon);
return ans * ax; return ans * ax;
} }

Loading…
Cancel
Save