在Fortran中混淆双精度真实

时间:2014-03-12 19:43:42

标签: fortran

现在我脑海里浮现出这个问题:什么是"接受"在现代Fortran中声明双精度真实的方法?按照从最旧到最新的顺序,故事似乎是这样的:DOUBLE PRECISION,然后是REAL(kind=8),然后是INTEGER, PARAMETER :: dp=kind(1.d0) REAL(kind=dp) - Metcalf现在说dp=kind(0.d0) - 现在float32=selected_real_kind(6,37)float64=selected_real_kind(15,307)。所以......

  1. 我现在应该如何宣布双精度真实?
  2. kind中的REAL(kind=dp)是多余的?
  3. 在编译时是否需要使用gfortranifort调用双精度实数的特殊标志?

3 个答案:

答案 0 :(得分:22)

我个人现在写

use, intrinsic :: iso_fortran_env

其中包含具有明显含义的int32real64等参数,可以像这样使用:

real(real64) :: a_64_bit_real_scalar

请注意,标准不保证kind=8提供8字节类型。类型参数所采用的值不是标准化的,并且因编译器而异。

如果需要,您可以编写

等语句
use, intrinsic :: iso_fortran_env, dp=>real64
...
real(dp) :: a_64_bit_real_scalar

答案 1 :(得分:4)

  

1)我现在应该如何宣布双精度真实?

我个人更喜欢使用

integer, parameter :: wp = selected_real_kind(15,307)
real(wp) :: var

方法。但正如马克指出的那样,iso_fortran_env是另一种直截了当的方法。如果您计划使用C接口,则可能需要尝试ISO_C_BINDING模块并使用

use iso_c_binding
real(c_double) :: var

获得你想要的双精度。

  

2)kind中的REAL(kind=dp)是多余的?

是的。

  

3)在编译时是否需要使用gfortranifort调用双精度实数的特殊标志?

对于gfortran,您可以使用编译标记-fdefault-real-8。对于ifort,您可以使用-real-size=64标记。

答案 2 :(得分:0)

目前推荐的在Fortran中声明双精度实数的方法是:

INTEGER, PARAMETER :: rk = SELECTED_REAL_KIND(15, 307)
REAL(rk) :: x
...