意外的实常量下溢(Fortran 和 R)

unexpected real constant underflow (Fortran and R)

我正在尝试将其他人的 Fortran 程序转换为子例程,以便我可以从 R 中调用它。我正在通过调用

来编译 Fortran 程序(称为 'midpSS9.f')
R CMD SHLIB midpSS9.f
gfortran -m64      -02 -mtune=core2 -c midpSS9.f -o midpSS9.o

但我收到了几个(基本相同的)警告:

Warning: Real constant underflows its kind at (1)
midpSS9.f:59.44
    if (part3 .e. 0.0) part3 = 1.0E-307
                                       1

我在子例程的顶部声明 part3 变量为实数。根据我的理解(取自 here),如果您正在使用 64 位计算机(我就是),那么最小的数字应该是 0.5E–308。那么,为什么会在这里抱怨呢?

PS: 这是我第一次使用 Fortran,抱歉,如果这很明显。

在这个表达式中,

part3 = 1.0E-307

right-hand这边是single-precision因为使用了E表示法;要使其成为 double-precision,只需将 E 替换为 D(或 d),这样

part3 = 1.0D-307

另一个问题是 part3 需要声明为 double-precision 变量。请注意,real :: part3part3 声明为 single-precision,因此我们需要使用类似 real(8) :: part3 或更便携的方式,如

use iso_fortran_env, only: dp => real64
real(dp) :: part3

(这可能需要相当新版本的编译器)。使用这种精度参数,也可以将 double-precision 文字写为

part3 = 1.0e-307_dp

这种方法的一个优点是可以通过简单地更改 dp 的定义并根据需要在单精度和 double-precision 之间切换来更改所有文字的精度。如果是这种情况,使用 rk (= "real kind") 而不是 dp (= "double precision") 这样的名称可能会更好地避免歧义。