pan*_*Box 1 precision fortran r
我正在尝试将其他人的 fortran 程序转换为子例程,以便我可以从 R 调用它。我正在通过调用来编译 fortran 程序(称为“midpSS9.f”)
\n\nR CMD SHLIB midpSS9.f\ngfortran -m64 -02 -mtune=core2 -c midpSS9.f -o midpSS9.o\nRun Code Online (Sandbox Code Playgroud)\n\n但我收到几个(本质上相同的)警告:
\n\nWarning: Real constant underflows its kind at (1)\nmidpSS9.f:59.44\n if (part3 .e. 0.0) part3 = 1.0E-307\n 1\nRun Code Online (Sandbox Code Playgroud)\n\n我在子例程的顶部将第 3 部分变量声明为实数。根据我的理解(取自这里),如果您使用的是 64 位计算机(我就是),则最小数字应该是 0.5E\xe2\x80\x93308。那么,为什么会在这里抱怨呢?
\n\nPS:这是我第一次使用 Fortran,如果这是显而易见的,抱歉。
\n在这个表达中,
part3 = 1.0E-307
Run Code Online (Sandbox Code Playgroud)
右侧是单精度的,因为E使用了符号;要使其成为双精度,只需替换E为D(或d),这样
part3 = 1.0D-307
Run Code Online (Sandbox Code Playgroud)
另一个问题是part3需要将其声明为双精度变量。请注意,real :: part3声明part3为单精度,因此我们需要使用类似real(8) :: part3或更便携的方式,例如
use iso_fortran_env, only: dp => real64
real(dp) :: part3
Run Code Online (Sandbox Code Playgroud)
(这可能需要一个相当新版本的编译器)。使用这种精度参数,还可以将双精度文字写为
part3 = 1.0e-307_dp
Run Code Online (Sandbox Code Playgroud)
这种方法的一个优点是,只需根据需要更改单精度和dp双精度的定义以及在单精度和双精度之间切换,即可更改所有文字的精度。如果是这种情况,像rk(= "real kind") 而不是dp(= "double precision") 这样的名称可能会更好地避免歧义。
| 归档时间: |
|
| 查看次数: |
702 次 |
| 最近记录: |