次のコードをFortran 90で実装しました。ここで、パラメータの対数を使用してパラメータtauを計算したい場合は、 OSXエルキャピタンでのgfortran 6.1 MacBook Airの2013年を使用してコンパイルするとき0の対数は、到達不可能な条件の場合でもエラーを発生させます
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
はしかし、私は次のエラーを取得する:私は、コードにどのような間違いを
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のすべての質問について、tag [tag:fortran]を使用してください。 –
Fortran 90(30年近く)に自分自身を限定している理由は何ですか? Modern Fortranには、このような問題のロバスト性を向上させるための固有モジュール 'ieee_arithmetic'があります。 – jlokimlin