Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
意外的实常数下溢(Fortran和R)_R_Fortran_Precision - Fatal编程技术网

意外的实常数下溢(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

我正在尝试将其他人的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
                                       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
(=“双精度”)更能避免歧义