From 46f74e1deee549b41160d353ce0c8f7db555d36c Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 17 Sep 2015 15:51:54 +0000 Subject: Fix tgamma missing underflows (bug 18951). Similar to various other bugs in this area, tgamma functions can fail to raise the underflow exception when the result is tiny and inexact but one or more low bits of the intermediate result that is scaled down are zero. This patch forces the exception in a similar way to previous fixes. Tested for x86_64, x86, mips64 and powerpc. [BZ #18951] * sysdeps/ieee754/dbl-64/e_gamma_r.c (__ieee754_gamma_r): Force underflow exception for small results. * sysdeps/ieee754/flt-32/e_gammaf_r.c (__ieee754_gammaf_r): Likewise. * sysdeps/ieee754/ldbl-128/e_gammal_r.c (__ieee754_gammal_r): Likewise. * sysdeps/ieee754/ldbl-128ibm/e_gammal_r.c (__ieee754_gammal_r): Likewise. * sysdeps/ieee754/ldbl-96/e_gammal_r.c (__ieee754_gammal_r): Likewise. * math/auto-libm-test-in: Add more tests of tgamma. * math/auto-libm-test-out: Regenerated. --- sysdeps/ieee754/dbl-64/e_gamma_r.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'sysdeps/ieee754/dbl-64') diff --git a/sysdeps/ieee754/dbl-64/e_gamma_r.c b/sysdeps/ieee754/dbl-64/e_gamma_r.c index adeb61a248..d1acaa6a12 100644 --- a/sysdeps/ieee754/dbl-64/e_gamma_r.c +++ b/sysdeps/ieee754/dbl-64/e_gamma_r.c @@ -194,6 +194,11 @@ __ieee754_gamma_r (double x, int *signgamp) double tret = M_PI / (-x * sinpix * gamma_positive (-x, &exp2_adj)); ret = __scalbn (tret, -exp2_adj); + if (ret < DBL_MIN) + { + double force_underflow = ret * ret; + math_force_eval (force_underflow); + } } } } -- cgit 1.4.1