意外的实常数下溢(Fortran和R)
我正在尝试将其他人的fortran程序转换为子例程,以便从R调用它。我正在通过调用意外的实常数下溢(Fortran和R),r,fortran,precision,R,Fortran,Precision,我正在尝试将其他人的fortran程序转换为子例程,以便从R调用它。我正在通过调用 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
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变量为实数。根据我的理解(取自),如果您使用的是64-but机器(我是),最小的数字应该是0.5E–308。那么,这为什么会在这里抱怨呢
PS:这是我第一次使用fortran,如果这是显而易见的,很抱歉。在这个表达式中
part3 = 1.0E-307
右侧为单精度,因为使用了E
符号;要使其具有双精度,只需将E
替换为D
(或D
),即可
另一个问题是,part3
需要声明为双精度变量。请注意,real::part3
将part3
声明为单精度,因此我们需要使用类似于real(8)::part3
或类似于
use iso_fortran_env, only: dp => real64
real(dp) :: part3
(这可能需要一个新版本的编译器)。使用这种精度参数,还可以编写双精度文字,如下所示:
part3 = 1.0e-307_dp
这种方法的一个优点是,只要更改dp
的定义并根据需要在单精度和双精度之间切换,就可以更改所有文本的精度。如果是这种情况,像rk
(=“real kind”)这样的名称可能比dp
(=“双精度”)更能避免歧义
part3 = 1.0E-307
右侧为单精度,因为使用了E
符号;要使其具有双精度,只需将E
替换为D
(或D
),即可
另一个问题是,part3
需要声明为双精度变量。请注意,real::part3
将part3
声明为单精度,因此我们需要使用类似于real(8)::part3
或类似于
use iso_fortran_env, only: dp => real64
real(dp) :: part3
(这可能需要一个新版本的编译器)。使用这种精度参数,还可以编写双精度文字,如下所示:
part3 = 1.0e-307_dp
这种方法的一个优点是,只要更改dp
的定义并根据需要在单精度和双精度之间切换,就可以更改所有文本的精度。如果是这种情况,像rk
(=“real kind”)这样的名称可能比dp
(=“双精度”)更能避免歧义