Fortran `double precision` 与 C `double` 不同的任何平台?

Any platform where Fortran `double precision` is different from C `double`?

为了与 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。现在对于整数,这是至关重要的,因为默认 INTEGER 类型可能(取决于编译器和平台)很好地包装成 64 位整数类型,即使 int 是 32 位。

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

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

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

我想这取决于您对 "practical compiler" 的看法。

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

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

考虑具有编译时选项 -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

已编译 with/without -double-size 128 我看到了 F/T.

当然,正如 Vladimir F 评论的那样,即使排除类型的大小,在互操作性方面也需要考虑更多。真的很想用real(c_double) ...给个互操作的real.