bug-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-gsl] overflow in gsl_ran_beta_pdf, gsl 1.14


From: Michael Radford
Subject: [Bug-gsl] overflow in gsl_ran_beta_pdf, gsl 1.14
Date: Thu, 15 Jul 2010 15:17:00 -0700
User-agent: Mutt/1.5.18 (2008-05-17)

Hi,

The function gsl_ran_beta_pdf contains the following section,
which is causing incorrect overflows for x == 0 or 1 and when
a and b are large enough:

(at randist/beta.c:53)
      ...
      double gab = gsl_sf_lngamma (a + b);
      double ga = gsl_sf_lngamma (a);
      double gb = gsl_sf_lngamma (b);

      if (x == 0.0 || x == 1.0)
        {
          p = exp (gab - ga - gb) * pow (x, a - 1) * pow (1 - x, b - 1);
        }
      else
      ...

For example:
(gdb) call gsl_ran_beta_pdf(1,100,100)
$26 = 0
(gdb) call gsl_ran_beta_pdf(0,100,100)
$27 = 0
(gdb) call gsl_ran_beta_pdf(1,1000,1000)
$28 = -nan(0x8000000000000)
(gdb) call gsl_ran_beta_pdf(0,1000,1000)
$29 = -nan(0x8000000000000)

but the correct result is always 0 when x == 0 or 1 and a, b > 1.

The reason is that the call to exp() overflows when a and b are
large enough.  However, it's unnecessary to call exp() when either
of the two calls to pow() will return 0.

I'm attaching a minimal patch which simply checks for a, b > 1
and explicitly returns 0 in that case.

Mike

Attachment: beta.patch
Description: Text Data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]