现在我脑海里浮现出这个问题:什么是"接受"在现代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)
。所以......
kind
中的REAL(kind=dp)
是多余的?gfortran
或ifort
调用双精度实数的特殊标志?答案 0 :(得分:22)
我个人现在写
use, intrinsic :: iso_fortran_env
其中包含具有明显含义的int32
,real64
等参数,可以像这样使用:
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)在编译时是否需要使用
gfortran
或ifort
调用双精度实数的特殊标志?
对于gfortran
,您可以使用编译标记-fdefault-real-8
。对于ifort
,您可以使用-real-size=64
标记。
答案 2 :(得分:0)
目前推荐的在Fortran中声明双精度实数的方法是:
INTEGER, PARAMETER :: rk = SELECTED_REAL_KIND(15, 307)
REAL(rk) :: x
...