在Fortran中混淆双精度真实

Joe*_*itt 14 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

Hig*_*ark 23

我个人现在写

use, intrinsic :: iso_fortran_env
Run Code Online (Sandbox Code Playgroud)

其包括参数,例如int32,real64它们具有明显的含义,并且可以这样使用:

real(real64) :: a_64_bit_real_scalar
Run Code Online (Sandbox Code Playgroud)

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

如果需要,您可以编写诸如的语句

use, intrinsic :: iso_fortran_env, dp=>real64
...
real(dp) :: a_64_bit_real_scalar
Run Code Online (Sandbox Code Playgroud)


Kyl*_*nos 5

1)我现在应该如何声明双精度实数?

我个人更喜欢使用

integer, parameter :: wp = selected_real_kind(15,307)
real(wp) :: var
Run Code Online (Sandbox Code Playgroud)

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

use iso_c_binding
real(c_double) :: var
Run Code Online (Sandbox Code Playgroud)

并获得您想要的双精度。

2) 是kind多余的吗REAL(kind=dp)

是的。

3)编译时是否需要任何特殊标志来使用gfortranor调用双精度实数ifort

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

  • +1 为了完整性,请小心“-fdefault-real-8”,因为它将“双精度”提升到 16 字节,请参阅“man gfortran”并查看“-fdefault-double-8”。 (2认同)