summaryrefslogtreecommitdiff
path: root/libm/float/chdtrf.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-05-10 00:40:28 +0000
committerEric Andersen <andersen@codepoet.org>2001-05-10 00:40:28 +0000
commit1077fa4d772832f77a677ce7fb7c2d513b959e3f (patch)
tree579bee13fb0b58d2800206366ec2caecbb15f3fc /libm/float/chdtrf.c
parent22358dd7ce7bb49792204b698f01a6f69b9c8e08 (diff)
uClibc now has a math library. muahahahaha!
-Erik
Diffstat (limited to 'libm/float/chdtrf.c')
-rw-r--r--libm/float/chdtrf.c210
1 files changed, 210 insertions, 0 deletions
diff --git a/libm/float/chdtrf.c b/libm/float/chdtrf.c
new file mode 100644
index 000000000..53bd3d961
--- /dev/null
+++ b/libm/float/chdtrf.c
@@ -0,0 +1,210 @@
+/* chdtrf.c
+ *
+ * Chi-square distribution
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * float df, x, y, chdtrf();
+ *
+ * y = chdtrf( df, x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the area under the left hand tail (from 0 to x)
+ * of the Chi square probability density function with
+ * v degrees of freedom.
+ *
+ *
+ * inf.
+ * -
+ * 1 | | v/2-1 -t/2
+ * P( x | v ) = ----------- | t e dt
+ * v/2 - | |
+ * 2 | (v/2) -
+ * x
+ *
+ * where x is the Chi-square variable.
+ *
+ * The incomplete gamma integral is used, according to the
+ * formula
+ *
+ * y = chdtr( v, x ) = igam( v/2.0, x/2.0 ).
+ *
+ *
+ * The arguments must both be positive.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0,100 5000 3.2e-5 5.0e-6
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * chdtrf domain x < 0 or v < 1 0.0
+ */
+ /* chdtrcf()
+ *
+ * Complemented Chi-square distribution
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * float v, x, y, chdtrcf();
+ *
+ * y = chdtrcf( v, x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the area under the right hand tail (from x to
+ * infinity) of the Chi square probability density function
+ * with v degrees of freedom:
+ *
+ *
+ * inf.
+ * -
+ * 1 | | v/2-1 -t/2
+ * P( x | v ) = ----------- | t e dt
+ * v/2 - | |
+ * 2 | (v/2) -
+ * x
+ *
+ * where x is the Chi-square variable.
+ *
+ * The incomplete gamma integral is used, according to the
+ * formula
+ *
+ * y = chdtr( v, x ) = igamc( v/2.0, x/2.0 ).
+ *
+ *
+ * The arguments must both be positive.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0,100 5000 2.7e-5 3.2e-6
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * chdtrc domain x < 0 or v < 1 0.0
+ */
+ /* chdtrif()
+ *
+ * Inverse of complemented Chi-square distribution
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * float df, x, y, chdtrif();
+ *
+ * x = chdtrif( df, y );
+ *
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Finds the Chi-square argument x such that the integral
+ * from x to infinity of the Chi-square density is equal
+ * to the given cumulative probability y.
+ *
+ * This is accomplished using the inverse gamma integral
+ * function and the relation
+ *
+ * x/2 = igami( df/2, y );
+ *
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0,100 10000 2.2e-5 8.5e-7
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * chdtri domain y < 0 or y > 1 0.0
+ * v < 1
+ *
+ */
+
+/* chdtr() */
+
+
+/*
+Cephes Math Library Release 2.2: July, 1992
+Copyright 1984, 1987, 1992 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+#include <math.h>
+
+#ifdef ANSIC
+float igamcf(float, float), igamf(float, float), igamif(float, float);
+#else
+float igamcf(), igamf(), igamif();
+#endif
+
+float chdtrcf(float dff, float xx)
+{
+float df, x;
+
+df = dff;
+x = xx;
+
+if( (x < 0.0) || (df < 1.0) )
+ {
+ mtherr( "chdtrcf", DOMAIN );
+ return(0.0);
+ }
+return( igamcf( 0.5*df, 0.5*x ) );
+}
+
+
+float chdtrf(float dff, float xx)
+{
+float df, x;
+
+df = dff;
+x = xx;
+if( (x < 0.0) || (df < 1.0) )
+ {
+ mtherr( "chdtrf", DOMAIN );
+ return(0.0);
+ }
+return( igamf( 0.5*df, 0.5*x ) );
+}
+
+
+float chdtrif( float dff, float yy )
+{
+float y, df, x;
+
+y = yy;
+df = dff;
+if( (y < 0.0) || (y > 1.0) || (df < 1.0) )
+ {
+ mtherr( "chdtrif", DOMAIN );
+ return(0.0);
+ }
+
+x = igamif( 0.5 * df, y );
+return( 2.0 * x );
+}