/*  POCHISQ  --  probability of chi-square value

              Adapted from:
                      Hill, I. D. and Pike, M. C.  Algorithm 299
                      Collected Algorithms for the CACM 1967 p. 243
              Updated for rounding errors based on remark in
                      ACM TOMS June 1985, page 185
*/
double chiAreaRight(double x, int df)
{
    const double LOG_SQRT_PI = 0.5723649429247000870717135;
    const double I_SQRT_PI   = 0.5641895835477562869480795;

    double a, y, s;
    double e, c, z;
    bool even;

    if (x <= 0.0 || df < 1) return 1.0;

    a = 0.5 * x;
    even = (df % 2 == 0);

    if (df > 1)
        y = ex(-a);

    s = even ? y : (2.0 * poz(-sqrt(x)));

    if (df > 2)
    {
        x = 0.5 * (df - 1.0);
        z = even ? 1.0 : 0.5;
        if (a > BIGX)
        {
            e = even ? 0.0 : LOG_SQRT_PI;
            c = log(a);
            while (z <= x)
            {
                e = log(z) + e;
                s += ex(c * z - a - e);
                z += 1.0;
            }
            return s;
        }
        else
        {
            e = even ? 1.0 : (I_SQRT_PI / sqrt(a));
            c = 0.0;
            while (z <= x) 
            {
                e = e * (a / z);
                c = c + e;
                z += 1.0;
            }
            return c * y + s;
        }
    }
    else
    {
        return s;
    }

}
예제 #2
0
quick(int li, int ls, int a[100])
{
   if (li < ls)
   {
      poz(li, ls, &k, a);
      quick(li, k-1, a);
      quick(k+1, ls, a);
   }

   return 0;
}
예제 #3
0
double pochisq(
    	const double ax,    /* obtained chi-square value */
     	const int df	    /* degrees of freedom */
     	)
{
    double x = ax;
    double a, y, s;
    double e, c, z;
    int even;	    	    /* true if df is an even number */

    if (x <= 0.0 || df < 1) {
    	return 1.0;
    }

    a = 0.5 * x;
    even = (2 * (df / 2)) == df;
    y = 0.0;
    if (df > 1) {
    	y = ex(-a);
    }
    s = (even ? y : (2.0 * poz(-sqrt(x))));
    if (df > 2) {
	x = 0.5 * (df - 1.0);
	z = (even ? 1.0 : 0.5);
	if (a > BIGX) {
    	    e = (even ? 0.0 : LOG_SQRT_PI);
    	    c = log(a);
    	    while (z <= x) {
		e = log(z) + e;
		s += ex(c * z - a - e);
		z += 1.0;
    	    }
    	    return (s);
    	} else {
	    e = (even ? 1.0 : (I_SQRT_PI / sqrt(a)));
	    c = 0.0;
	    while (z <= x) {
		    e = e * (a / z);
		    c = c + e;
		    z += 1.0;
    	    }
	    return (c * y + s);
    	}
    } else {
    	return s;
    }
}
예제 #4
0
//
//  POCHISQ  --  probability of chi-square value
//
//  Adapted from:
//          Hill, I. D. and Pike, M. C.  Algorithm 299
//          Collected Algorithms for the CACM 1967 p. 243
//  Updated for rounding errors based on remark in
//          ACM TOMS June 1985, page 185
//
double pochisq( double x, int df)
{
    double a, y, s;
    double e, c, z;
    bool even; // True if df is an even number

    double LOG_SQRT_PI = 0.5723649429247000870717135; // log(sqrt(pi))
    double I_SQRT_PI = 0.5641895835477562869480795;   // 1 / sqrt(pi)

    if (x <= 0.0 || df < 1) {
        return 1.0;
    }

    a = 0.5 * x;
    even = !(df % 2);
    y = ex(-a);
    s = (even ? y : (2.0 * poz(-sqrt(x))));
    if (df > 2) {
        x = 0.5 * (df - 1.0);
        z = (even ? 1.0 : 0.5);
        if (a > BIGX) {
            e = (even ? 0.0 : LOG_SQRT_PI);
            c = log(a);
            while (z <= x) {
                e = log(z) + e;
                s += ex(c * z - a - e);
                z += 1.0;
            }
            return s;
        } else {
            e = (even ? 1.0 : (I_SQRT_PI /sqrt(a)));
            c = 0.0;
            while (z <= x) {
                e = e * (a / z);
                c = c + e;
                z += 1.0;
            }
            return c * y + s;
        }
    } else {
        return s;
    }
}