Fortran DGAMIC netlib函数,用于计算带有错误的不完整Gamma出口
我需要一个程序来计算不完整的伽马函数。当然,我已经尝试了netlib路由并找到了dgamic函数。但是,在编译以下测试程序之后Fortran DGAMIC netlib函数,用于计算带有错误的不完整Gamma出口,fortran,gfortran,netlib,Fortran,Gfortran,Netlib,我需要一个程序来计算不完整的伽马函数。当然,我已经尝试了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
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
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
像这样使用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的修改版本更方便(参见第页)。因此,程序可能类似于: 1) 从下载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) 和Comple,例如,与测试程序
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
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的修改,这可能会很乏味……)@H.p.Mark实际上试图将所有这些都封装在一个模块中,但所有这些C注释都破坏了我的编译。我试着在另一只手臂抱着一个愤怒的婴儿的同时编写一个测试用例——我想这会让我进入一个严重散焦的fortran程序员类;)——在写原始文章时,你不必费心去查看gfortran的信息。你可以把所有的东西都放在一个模块中,并且仍然使用固定格式的源代码。当然,您不能将其剪切并粘贴到自由格式的source.f90文件中。但只要将
模块
和结束模块
添加到原始源文件中就没有问题。我认为如果原始Slatec站点中的d1mach.f包含“stop”语句而不是静默返回(例如,“stop”d1mach之类的行需要手动更新“),这将非常有用。这样,我们注意到需要自动修改它。。。