是否有Fortran“双精度”与C“双精度”不同的平台?

sum*_*ier 1 c fortran language-interoperability fortran-iso-c-binding

为了与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
Run Code Online (Sandbox Code Playgroud)

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

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

REAL*4  (or)  REAL               ->  float
REAL*8  (or)  DOUBLE PRECISION   ->  double
Run Code Online (Sandbox Code Playgroud)

因此,这里的问题:是否有任何实际的平台或编译器在哪里,这是没有满足,例如,在那里sizeof(REAL*4) != sizeof(float)

fra*_*lus 6

考虑gfortran其中有编译时的选项-freal-4-real-8-freal-8-real-16等等。这些变化对Fortran真实的,包括那些非标准声明的大小real*4

还考虑ifort:

  use, intrinsic :: iso_c_binding
  print*, C_SIZEOF(0._c_double).eq.C_SIZEOF(0d0)
end program
Run Code Online (Sandbox Code Playgroud)

编译有/没有-double-size 128F/ T

当然,正如弗拉基米尔·F(Vladimir F)所评论的那样,即使不包括类型的大小,在互操作性方面也需要考虑更多。确实希望使用real(c_double) ...一个可互操作的实数。