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 x
和 float 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 个字节)。
考虑具有编译时选项 -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.
为了与 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 x
和 float 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 个字节)。
考虑具有编译时选项 -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.