【发布时间】:2016-11-07 00:39:06
【问题描述】:
我在 Fortran 90 中实现了以下代码,我希望使用某些参数的对数来计算参数 tau,前提是这些参数在适当的范围内。
MODULE nrtype
INTEGER, PARAMETER :: SP=KIND(1.0)
INTEGER, PARAMETER :: DP=KIND(1.0d0)
INTEGER, PARAMETER :: I4B=SELECTED_INT_KIND(9)
INTEGER, PARAMETER :: I2B=SELECTED_INT_KIND(4)
INTEGER, PARAMETER :: I1B=SELECTED_INT_KIND(2)
INTEGER, PARAMETER :: SPC=KIND((1.0,1.0))
INTEGER, PARAMETER :: DPC=KIND((1.0D0,1.0D0))
INTEGER, PARAMETER :: LGT=KIND(.TRUE.)
END MODULE
MODULE parameters
USE nrtype
REAL(DP), PARAMETER :: beta=.98_dp
REAL(DP), PARAMETER :: maxtol=1.0e-6_dp
REAL(DP), PARAMETER :: theta=1.0_dp
REAL(DP), PARAMETER :: delta=0.0_dp
END MODULE
PROGRAM mainp
USE parameters
USE nrtype
IMPLICIT NONE
INTEGER(I4B) :: tau
REAL(DP) :: taustar
IF (theta > 1.0_dp .AND. (delta > 0.0_dp .AND. delta < 1.0_dp)) THEN
taustar=LOG(maxtol/(beta*(1.0_dp-delta)*(theta-1.0_dp)))/LOG(beta*delta)
tau=CEILING(taustar,REAL(DP))
ENDIF
IF (theta > 1.0_dp .AND. delta==0.0_dp) THEN
tau=1
ELSEIF (theta == 1.0_DP .OR. delta==1.0_DP) THEN
tau=0
ENDIF
END PROGRAM main
但是,在带有 OSX El Capitan 的 MacBook Air 2013 中使用 gfortran 6.1 进行编译时,出现以下错误:
program.f90:30:69:
taustar=LOG(maxtol/(beta*(1.0_dp-delta)*(theta-1.0_dp)))/LOG(beta*delta)
1
Error: Argument of LOG at (1) cannot be less than or equal to zero
我在代码上犯了什么错误?看起来好像没有识别 IF 语句。
【问题讨论】:
-
对所有 Fortran 问题使用标签 fortran。
-
您将自己限制在 Fortran 90(近 3 个十年前)有什么特别的原因吗?现代 Fortran 具有内在模块
ieee_arithmetic来提高此类问题的稳健性。
标签: if-statement fortran fortran90 gfortran