两年多来,我一直在为应用物理问题的数值模拟编写 FORTRAN 代码,并尝试遵循 Fortran Best Practices 中描述的约定。 .
更具体地说,我将参数定义为
integer, parameter:: dp=kind(0.d0)
然后将它用于我的代码中的所有 double 。
但是,我发现(在这个论坛上)如果您使用其他编译器编译代码,使用 KIND 参数不一定会给您相同的精度。在 this question ,我读到一个可能的解决方案是使用 SELECTED_REAL_KIND 和 SELECTED_INT_KIND,据我了解,它们遵循一些约定。
但后来,我发现了 ISO_FORTRAN_ENV定义 REAL32、REAL64 和 REAL128 种类参数的模块。
我想这些确实是可移植的,并且由于它们属于 FORTRAN 2008 标准(尽管受 GNU 支持),我想我应该使用这些吗?
因此,如果有更多知识和经验的人能解决这个困惑,我将不胜感激。
另外,我有一个关于在 HDF5 中使用这些种类的后续问题。我使用的是 H5T_NATIVE_DOUBLE,它确实工作正常(据我所知)但是,in this document据说这是一个过时的功能,不应使用。相反,它们提供了一个功能
INTEGER(HID_T) FUNCTION h5kind_to_type(kind, flag) RESULT(h5_type) .
当我使用它时,打印出与 REAL64 对应的 HID_T 整数的确切数值给我 50331972,而 H5T_NATIVE_DOUBLE 给我 50331963,这是不同的。
如果我尝试使用由 H5kind_to_type 计算的值,HDF5 库运行得一样好,并且使用 XDMF ,我可以在不修改随附的 .xmf 文件的情况下在 VisIt 或 Paraview 中绘制输出。
所以我的第二个问题是(再次):这是正确的用法吗?
最佳答案
类型double precision
和相应的种类kind(1.d0)
完全由标准定义。但它们也不是完全固定的。事实上,历史上有很多计算机,它们的浮点数使用不同种类的本地格式,标准必须允许这样做!
所以,一个 double precision
是一种real
它具有比默认 real
足够高的精度.默认的real也不是固定的,它必须与计算机可以使用的内容相对应。
现在我们有了浮点数的标准IEEE_754它定义了 IEEE single (binary32) 和 IEEE double 类型 (binary64) 和其他一些类型。如果计算机硬件实现了这个标准,就像几乎所有 20 岁以下的计算机一样,编译器很可能选择这两个作为 real
。和 double precision
.
Fortran 2008 标准带来了两种常量 real32
和 real64
(和别的)。它们使您能够请求具有 32 位和 64 位存储大小的真实类型。不能保证它会是 IEEE 类型,但在现代计算机上几乎可以肯定。
要请求 IEEE 类型(如果可用),请使用内部函数 ieee_selected_real_kind()
来自模块 ieee_arithmetic
.
IEEE 类型在所有计算机中都是相同的(不包括字节序!),但编译器不需要支持它们,因为您的计算机可能在硬件上不支持这些。这只是理论上的可能性,所有现代计算机都支持它们。
现在对于您的 HDF 常量,这些显然只是某个表的一些索引,它们是否不同并不重要,重要的是它们的含义是否相同,在您的情况下它们是否相同。
正如我在上面所写的,在支持 IEEE 754 的计算机上,double precision
极有可能。将与 IEEE double 相同。如果您使用一些改变这种行为的编译器选项,它可能不会。有一些编译器选项可以提升默认 real
加倍,嘿嘿也可以推广double precision
到四精度(128 位)以保留需要 double precision
的标准语义具有更高的精度和存储大小。
结论:您可以同时使用这两种方式,也可以使用任何其他方式来选择您的种类常量(您也可以使用 iso_c_binding
的 c_float
和 c_double
),但您应该知道为什么这些方式不同以及它们的实际含义。
关于fortran - 对 FORTRAN 中的种类感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30024378/