fortran - 对 FORTRAN 中的种类感到困惑

标签 fortran precision hdf5 double-precision

两年多来,我一直在为应用物理问题的数值模拟编写 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 标准带来了两种常量 real32real64 (和别的)。它们使您能够请求具有 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_bindingc_floatc_double ),但您应该知道为什么这些方式不同以及它们的实际含义。

关于fortran - 对 FORTRAN 中的种类感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30024378/

相关文章:

pointers - 通过指针访问类型后派生类型中 Fortran 字符串的奇怪行为

python - 是否有与 fortran 可重复格式描述符等效的 python 版本?

algorithm - Fortran 中的 Morris Pratt 表

fortran - 意图(inout)和指针虚拟参数之间的区别

c - 定点缩放和乘法精度

r - R 中浮点精度的极端数值

c++ - 所有整数值都完美地表示为 double 吗?

python - 在 iPython 中使用 HDF5 文件时出现异常 'HDFStore requires PyTables '

python - H5Py 和存储

c++ - 在 C++ 中将实际数据和调试数据流式传输到磁盘