【问题标题】:Any platform where Fortran `double precision` is different from C `double`?Fortran `double precision` 与 C `double` 不同的任何平台?
【发布时间】:2019-08-13 09:23:26
【问题描述】:

为了与 C 程序的互操作性,Fortran 标准的 2003 年修订版引入了一个模块 iso_c_binding,它允许人们编写如下内容:

USE iso_c_binding, ONLY: c_int, c_float
INTEGER(KIND=c_int) :: x
REAL(KIND=c_float) :: y

保证在 C 端精确映射到 int xfloat y。现在对于整数来说,这是至关重要的,因为即使 int 是 32 位,默认的 INTEGER 类型也可以(取决于编译器和平台)很好地包装为 64 位整数类型。

但是,对于浮点类型,以下映射似乎几乎是不可避免的:

REAL*4  (or)  REAL               ->  float
REAL*8  (or)  DOUBLE PRECISION   ->  double

所以问题来了:是否有任何实际平台或编译器对此满意,例如sizeof(REAL*4) != sizeof(float)

【问题讨论】:

  • 这个问题似乎忽略了 real 类型的 C 绑定的种类常量。如果想映射 C double,标准方法是 REAL(KIND = C_DOUBLE) :: a_double。与映射 C floats 类似。因此,绝不有必要对DOUBLE PRECISION 和默认REAL 的映射方式做出假设。
  • 我同意@JohnBollinger 的评论,但我认为这个问题的动机是“为什么我们需要real(c_float) for_c 而不仅仅是real for_c?”。对吗?
  • ...如果是这样,请您编辑问题以澄清,尤其是关于“几乎不可避免”使用默认实数和 DP 类型来映射 C 浮点类型的部分?
  • 您还必须考虑到它们的sizeof 相同的可能性,但它们是不同的数据类型。甚至int 也可以拥有与float 相同的sizeof,但在内部它们是不同的。值得注意的是,扩展精度 REAL*10 存储在内存中的整个字中,因此存储在 128 位中,但四倍精度 REAL*16 存储在相同的 128 位中。
  • @summentier 是的,你应该这样做。任何时候有人可能会使用一些(完全符合标准的)选项来编译您的代码,这些选项会更改默认类型。如果您有默认的 8 字节整数,为了保持符合标准,您还应该使用 8 字节实数和逻辑。即使没有,许多人使用这些促销标志编译代码,只需在本网站上的问题中搜索即可。你永远不知道谁以及如何编译你的代码。

标签: c fortran fortran-iso-c-binding language-interoperability


【解决方案1】:

考虑具有编译时选项-freal-4-real-8-freal-8-real-16 等的 gfortran。这些会更改 Fortran 实数的大小,包括使用非标准 real*4 声明的那些。

考虑一下ifort:

  use, intrinsic :: iso_c_binding
  print*, C_SIZEOF(0._c_double).eq.C_SIZEOF(0d0)
end program

编译有/没有-double-size 128我看到F/T

当然,正如 Vladimir F 所评论的那样,即使不考虑类型的大小,在互操作性方面还有更多需要考虑。使用real(c_double) ... 来提供可互操作的真实环境确实是可取的。

【讨论】:

    【解决方案2】:

    我猜,这取决于您对“实用编译器”的想法。

    C 标准和 Fortran 标准都不需要符合 IEEE 标准,但大多数 [需要引用] 编译器都遵守它(大多数处理器也是如此,因此这既是优化问题,也是一致性问题)。 Cray 和 VAX 处理器是显着的例外,因此您可能会为这些系统找到一个编译器,它符合处理器的浮点实现。 (例如,在 Cray 上,浮点数为 8 个字节)。

    更多:http://www.quadibloc.com/comp/cp0201.htm

    【讨论】:

    • 还有更多内容。它实际上与整数没有什么不同,其中 Fortran 整数可以是 C int 的两倍。
    • 在 Cray Vector 系统上,浮点数为 8 个字节。在他们的大多数其他产品上,当然还有我所知道的所有最近的产品上,浮点数是 4 个字节。我认为 Cray 已经 10 多年没有生产矢量系统了。
    • @VladimirF 是的,有很多关于编译器的细节可以花很多时间研究。但是对于OP关于fortran的REAL * 4的大小与C的float大小相比的问题,我认为这个答案是合适的。
    • 缺少的是关键考虑因素,而这两种语言极有可能使用相同的 IEEE 浮点数、双精度数,......它们可能会有所不同(即使在实践中)它们在其中一种 IEEE 类型调用 C 浮点、C 双精度、Fortran 实数和 Fortran 双精度。 Fortran real 可能与 Fortran real*4 不同(如果编译器完全支持这种非标准的东西)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多