/* 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; } }
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; }
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; } }
// // 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; } }