public static double Inverse(double y0)
{
if (y0 <= 0.0)
{
if (y0 == 0)
return Double.NegativeInfinity;
throw new ArgumentOutOfRangeException("y0");
}
if (y0 >= 1.0)
{
if (y0 == 1)
return Double.PositiveInfinity;
throw new ArgumentOutOfRangeException("y0");
}
double s2pi = Math.Sqrt(2.0 * Math.PI);
int code = 1;
double y = y0;
double x;
if (y > 0.8646647167633873)
{
y = 1.0 - y;
code = 0;
}
if (y > 0.1353352832366127)
{
y -= 0.5;
double y2 = y * y;
x = y + y * ((y2 * Special.Polevl(y2, inverse_P0, 4)) / Special.P1evl(y2, inverse_Q0, 8));
x *= s2pi;
return x;
}
x = Math.Sqrt(-2.0 * Math.Log(y));
double x0 = x - Math.Log(x) / x;
double z = 1.0 / x;
double x1;
if (x < 8.0)
{
x1 = (z * Special.Polevl(z, inverse_P1, 8)) / Special.P1evl(z, inverse_Q1, 8);
}
else
{
x1 = (z * Special.Polevl(z, inverse_P2, 8)) / Special.P1evl(z, inverse_Q2, 8);
}
x = x0 - x1;
if (code != 0)
x = -x;
return x;
}