按照这个最佳实践指南,我的 Fortran 代码中有一个模块定义了双精度类型,
module kind_parameters
implicit none
public
! Double precision real numbers, 15 digits, range 10^-307 to 10^307-1; 64 bits
integer, parameter :: dp = selected_real_kind(15, 307)
end module kind_parameters
我的代码在所有浮点运算中都使用这种双精度类型,并经常使用 MKL。在这里,我总是使用 MKL 子程序的双精度版本,即 DGEMM 和 DSYEVD。
我不清楚我的用户定义类型是否与 MKL 期望的双精度类型一致。到目前为止,我使用 ifort/ifx 进行的所有测试似乎都运行良好,但我的做法是否存在潜在的缺陷?有没有更好的方法?
理论上,如果您在平台上工作的双精度类型并非 IEEE 双精度浮点类型,则可能会出现不一致的情况。例如,如果编译器(包括编译 MKL 的编译器)设置为使用 64 位浮点数作为默认类型,而将 128 位浮点数设置为双精度浮点数。在这种情况下,正如 Ian 所写,使用 来表示
kind(1.d0)
您的类型并没有什么问题。重要的代码风格建议是为您的类型使用命名常量,至于如何设置常量的值则不那么重要。如果需要双精度,则将其设置为双精度
kind(1.d0)
;如果需要与 C 语言的双精度兼容,则将其设置为c_double
;如果需要 64 位存储,则将其设置为real64
。实际上,所有这些方法通常都会产生相同的结果。您也可以使用selected_real_kind
,但在我看来,它在某种程度上没有达到预期,实际上已经过时了,尽管官方并未如此规定。在这一点上,我显然不同意 fortran-lang.org 的建议。这只是我的个人观点。