用于计算不完整 Gamma 的 DGAMIC netlib 函数退出时出现错误

DGAMIC netlib function to calculate incomplete Gamma exits with an error

我需要一个程序来计算不完整的 Gamma 函数。当然,我试过 netlib 路线并找到了 dgamic 函数。然而,在编译了下面的测试程序后

program test_dgamic
  implicit none
  interface 
     double precision function dgamic(in1,in2)
       double precision, intent(in) :: in1,in2
     end function dgamic
  end interface 


  print *, 'dgamic:', dgamic(1.d0,1.d0)
end program test_dgamic

像这样使用 gfortran 版本 6.2.0

gfortran main.f90 -o main dgamic.f d9lgic.f d9lgit.f d9gmic.f d9gmit.f dlgams.f dlngam.f dgamma.f d9lgmc.f dcsevl.f dgamlm.f initds.f d1mach.f xerclr.f xermsg.f xerprn.f xersve.f xgetua.f i1mach.f j4save.f xerhlt.f xercnt.f fdump.f

和 运行,我收到以下 slatec 错误消息

***MESSAGE FROM ROUTINE INITDS IN LIBRARY SLATEC.
 ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
 *  Chebyshev series too short for specified accuracy
 *  ERROR NUMBER = 1
 *   
 ***END OF MESSAGE

 ***JOB ABORT DUE TO UNRECOVERED ERROR.
0          ERROR MESSAGE SUMMARY
 LIBRARY    SUBROUTINE MESSAGE START             NERR     LEVEL     COUNT
 SLATEC     INITDS     Chebyshev series too         1         1         1

Note: The following floating-point exceptions are signalling: IEEE_DIVIDE_BY_ZERO

有没有人知道如何避免这种情况?从错误的外观来看,它看起来像是一个设计缺陷。

似乎问题(再次)是由于 Slatec 中的 d1mach.f,因为我们需要手动取消注释该文件的适当部分。实际上,使用 BLAS 站点提供的 d1mach.f 的修改版本更方便(参见 this 页面)。所以程序可能是这样的:

1) 从 original site

下载 slatec_src.tar.gz

2) 下载 d1mach.f 等的修改 (BLAS) 版本并使用它们代替 Slatec 版本

rm -f i1mach.f r1mach.f d1mach.f
wget http://www.netlib.org/blas/i1mach.f 
wget http://www.netlib.org/blas/r1mach.f
wget http://www.netlib.org/blas/d1mach.f 

3) 并编译,例如,使用测试程序

program main
    implicit none
    external dgamic
    double precision dgamic, a, x, y

    a = 1.0d0
    x = 1.0d0
    y = dgamic( a, x )

    print *, "a = ", a
    print *, "x = ", x
    print *, "y(slatec)        = ", y
    print *, "y(exact for a=1) = ", exp( -x )
end program 

这给出了

 a =    1.0000000000000000     
 x =    1.0000000000000000     
 y(slatec)        =   0.36787944117144233     
 y(exact for a=1) =   0.36787944117144233

为了比较,如果我们使用 d1mach.f 的 Slatec 版本,我们会得到相同的错误

 ***MESSAGE FROM ROUTINE INITDS IN LIBRARY SLATEC.
 ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
 *  Chebyshev series too short for specified accuracy
 *  ERROR NUMBER = 1
 ...

因为 d1mach.f 中没有设置精度(我们需要取消注释必要的部分,例如标记为 "IBM PC",再加上对遗留 Fortran 的一些修改,这可能很乏味...)