불완전한 감마 함수를 계산하는 절차가 필요합니다. 물론 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의 수정 된 버전을 사용하는 것이 더 편리합니다 ( 이 페이지 참조). 따라서 절차는 다음과 같을 수 있습니다.
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) 및 예를 들어 테스트 프로그램과 함께 사용
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에 대한 일부 수정 사항도 추가해야합니다 ...)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다