Fortran精确默认带/ out编译器标志

Mik*_*ike 5 fortran

我在Fortran的常数数字精度方面遇到了麻烦.

我是否需要将每一个都0.1写成0.1d0双精度?我知道编译器有一个标志,例如-fdefault-real-8在gfortran中解决了这种问题.它是一种便携可靠的方式吗?我怎么能检查标志选项是否真的适用于我的代码?

我使用F2py在我的Python代码中调用Fortran代码,即使我给出了一个未指定的标志,它也不会报告错误,这就是让我担心的问题.

fra*_*lus 5

在Fortran程序1.0中始终是默认的实数常量,并且1.0d0始终是双精度文字常量.

然而,"双精度"在不同的环境中意味着不同的东西.

在Fortran上下文中,"双精度"是指特定类型的实数,其精度高于默认实数.在更一般的通信中,"双精度"通常被认为是指与IEEE浮点规范匹配的特定实际64位.

gfortran的编译器标志-fdefault-real-8意味着默认实际需要8个字节,并且可能是编译器用来表示IEEE双精度的那个.

因此,1.0是默认的实数文字常量,而不是双精度文字常量,但默认实数可能恰好与IEEE双精度相同.

这样的问题反映了文字常数的精确含义.对于那些询问我关于旗帜的建议的人,就像-fdefault-real-8我要说的那样,以避免它们.


小智 0

您的问题的答案是:是的,您确实需要指示该常量是双精度的。使用 0.1 是此问题的一个常见示例,因为 4 字节和 8 字节表示不同。扩展精度字节全为零的其他常量(例如 0.5)不存在此问题。

这在 F90 中被引入 Fortran,并导致许多旧版 FORTRAN 代码的转换和重用出现问题。在 F90 之前,双精度 a = 0.1 的结果可以使用实数 0.1 或双精度 0.1 常量,尽管我使用的所有编译器都提供了双精度值。在使用已发布的结果测试遗留代码时,这可能是结果不一致的常见原因。例子经常被报道,例如本周论坛上的代码中出现了 PI=3.141592654。

然而,使用 0.1 作为子程序参数总是会引起问题,因为这将作为实常量传输。

因此,考虑到实际常量处理方式的历史,您确实需要在需要时显式指定双精度常量。这不是一种用户友好的方法。

  • 双精度和 1d.0 文字已存在于 FORTRAN IV 和 FORTRAN 66 标准中。 (2认同)