This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[patch, fortran] Fix PR 33683, wrong gamma function
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: fortran at gcc dot gnu dot org
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sun, 07 Oct 2007 22:04:41 +0200
- Subject: [patch, fortran] Fix PR 33683, wrong gamma function
Hello world,
this fixes PR 33683 on the sytems (such as libc systems) where gamma()
actually returns the logarithm of the gamma function.
The test case risks failure on systems where there is no tgamma()
function. We probably need a separate tgamma function for
these systems. The current patch is an improvement over the old status,
where we would return (horribly) wrong values silently.
Regression-tested on i686-pc-linux-gnu, where we used to return the
wrong values. OK for trunk?
Thomas
2007-10-07 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/33683
* mathbuiltins.def (GAMMA): Change function name to
"tgamma" instad of "gamma".
2007-10-07 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/33683
* gamma_5.f90: New test case
! { dg-do run }
! PR 33683 - we used to pick up the wrong gamma function
! from the library on some systems.
program main
implicit none
integer, parameter :: n_max = 20
double precision, dimension(0:n_max) :: c
double precision :: pi
integer :: n
double precision :: td, xd
real :: ts,xs
pi = 4 * atan(1.d0)
c(0) = 1.
do n=1, n_max
c(n) = (2*n-1)*c(n-1)*0.5d0
end do
do n=1, n_max
xs = n + 0.5
xd = n + 0.5d0
td = c(n)*sqrt(pi)
ts = c(n)*sqrt(pi)
if (abs(gamma(xs)-ts)/ts > 2e-6) call abort
if (abs(gamma(xd)-td)/td > 5e-14) call abort
end do
call tst_s(2.3, gamma(2.3))
call tst_s(3.7, gamma(3.7))
call tst_s(5.5, gamma(5.5))
call tst_d(4.2d0, gamma(4.2d0))
call tst_d(8.1d0, gamma(8.1d0))
contains
subroutine tst_s(a, b)
real :: a, b
if (abs(gamma(a) - b)/b > 1e-6) call abort
end subroutine tst_s
subroutine tst_d(a, b)
double precision :: a,b
if (abs(gamma(a) - b)/b > 5e-14) call abort
end subroutine tst_d
end program main
Index: /home/ig25/gcc/trunk/gcc/fortran/mathbuiltins.def
===================================================================
--- /home/ig25/gcc/trunk/gcc/fortran/mathbuiltins.def (revision 129050)
+++ /home/ig25/gcc/trunk/gcc/fortran/mathbuiltins.def (working copy)
@@ -30,5 +30,5 @@ DEFINE_MATH_BUILTIN (Y1, "y1",
DEFINE_MATH_BUILTIN (YN, "yn", 2)
DEFINE_MATH_BUILTIN (ERF, "erf", 0)
DEFINE_MATH_BUILTIN (ERFC, "erfc", 0)
-DEFINE_MATH_BUILTIN (GAMMA, "gamma", 0)
+DEFINE_MATH_BUILTIN (GAMMA, "tgamma", 0)
DEFINE_MATH_BUILTIN (LGAMMA,"lgamma", 0)