]> thyrsus.com Git - deal.git/commitdiff
Handle degenerate cases.
authorEric S. Raymond <esr@thyrsus.com>
Mon, 17 Apr 1995 11:44:49 +0000 (11:44 +0000)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 17 Apr 1995 11:44:49 +0000 (11:44 +0000)
deal.c

diff --git a/deal.c b/deal.c
index 5a630f0514009a734c6fd796532655bc809abada..30341635aed6918d89d7a161285deeab7931553f 100644 (file)
--- a/deal.c
+++ b/deal.c
@@ -1,7 +1,7 @@
 /*
  * deal -- compute combination probabilities for card draws
  *
- * ($Id: deal.c,v 1.18 1995/04/14 01:50:14 esr Exp esr $)
+ * ($Id: deal.c,v 1.19 1995/04/14 13:55:40 esr Exp esr $)
  *
  * Based on the `cardprobs' program written by Jeremy C. York
  * <jeremy@stat.cmu.edu> in September 1993; cleanup, comments, 
@@ -233,7 +233,7 @@ char **argv;
 static double hyper_prob(i, k, M, N)
     int i, k, M, N;
 {
-    double exp();
+    double p, exp();
 
     /* for the signal handler */
     si = i;
@@ -241,9 +241,14 @@ static double hyper_prob(i, k, M, N)
     sM = M;
     sN = N;
 
-    return(exp(log_a_choose_b(M,i)
+    p = exp(log_a_choose_b(M,i)
            + log_a_choose_b(N-M,k-i)
-           - log_a_choose_b(N, k)));
+           - log_a_choose_b(N, k));
+
+    if (p > 1)
+       p = 1;
+
+    return(p);
 }
 
 static double log_a_choose_b(a,b)
@@ -256,7 +261,10 @@ static double log_a_choose_b(a,b)
 
     signal(SIGFPE, choosecatch);
 
-    p = lgamma((double) (a+1)) - lgamma((double) (b+1)) -
+    if (b >= a)
+       p = 0;
+    else
+       p = lgamma((double) (a+1)) - lgamma((double) (b+1)) -
                 lgamma((double) (a-b+1));
 
     if (verbose)