This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]