From 1266e9a651cd42e28f5d4513527ca33fcda8a1f0 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 17 Apr 1995 11:44:49 +0000 Subject: [PATCH] Handle degenerate cases. --- deal.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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) -- 2.43.0