意外的实际恒定下溢(Fortran和R)

时间:2016-01-05 17:23:37

标签: r fortran precision

我正在尝试将其他人的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合作,对不起,如果这很明显的话。

1 个答案:

答案 0 :(得分:4)

在此表达式中,

part3 = 1.0E-307

右侧是单精度,因为使用了E符号;为了使其具有双精度,只需将E替换为D(或d),以便

part3 = 1.0D-307

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

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

(这可能需要一个相当新版本的编译器)。使用这种精度参数,还可以将双精度文字写为

part3 = 1.0e-307_dp

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