From: Eric S. Raymond Date: Mon, 17 Apr 1995 11:44:49 +0000 (+0000) Subject: Handle degenerate cases. X-Git-Tag: 2.0~5 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=1266e9a651cd42e28f5d4513527ca33fcda8a1f0;p=deal.git Handle degenerate cases. --- diff --git a/deal.c b/deal.c index 5a630f0..3034163 100644 --- 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 * 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)