ISO_FORTRAN_ENV或-fdefault-real-8将reals提升到双精度

时间:2018-03-31 14:39:48

标签: fortran double gfortran type-promotion

我一直在使用-fdefault-real-8的{​​{1}}选项自动宣传程序中任何位置声明的每个gfortran,以提高精度,以及任何常量例如 REAL。如果我想切换回单精度,我只需删除该选项并重新编译,而无需更改源代码中的单个字符。

在我开始使用1.23模块的时候,因为它允许我使用ISO_FORTRAN_ENV等常量,以及INPUT|OUTPUT|ERROR_UNITIOSTAT_END等等(似乎是在便携性的方向上是一个好的和容易的举动,我错了吗?)。从那时起,我一直在看到并忽略以下警告

IOSTAT_EOR

因为这种不相容性似乎到目前为止没有效果。

如果有可能并且值得,我现在想摆脱这个警告。

如果我理解正确,为了避免此警告,我应该放弃Warning: Use of the NUMERIC_STORAGE_SIZE named constant from intrinsic module ISO_FORTRAN_ENV at (1) is incompatible with option -fdefault-real-8 选项并将每-fdefault-real-8更改为REAL and/or to REAL(real64)(前提是在后一种情况下,语句REAL(dp)被放入该单元中),这对USE, INTRINSIC :: ISO_FORTRAN_ENV, dp => real64sed来说并不困难。

尽管如此,在我看来,这种变化与使用vim选项不同,因为所有常量将保持单精度,只要我没有&#39 ; t添加-fdefault-real-8给他们。 假设删除了 d0 选项并在任何地方使用了-fdefault-real-8,是否有任何方法可以使整个程序中的任何常量表现为每个都有ISO_FORTRAN_ENV后缀? 无论这是否可行,我是否正确地推断出我可以将以下行放在所有其他程序单元使用的单个模块中,然后每个模块都可以使用d0作为类型参数?

dp

我更喜欢这种方式,因为我可以通过仅更改该行来切换到USE, INTRINSIC :: ISO_FORTRAN_ENV INTEGER, PARAMETER :: dp = real64 real32或其他任何内容。

2 个答案:

答案 0 :(得分:2)

如果您只想使警告静音,而您不关心-fdefault-real-8对存储关联和某些Fortran标准要​​求的影响,请不要从模块中导入NUMERIC_STORAGE_SIZE。例如,

USE, INTRINSIC :: ISO_FORTRAN_ENV, only: INPUT_UNIT,OUTPUT_UNIT,ERROR_UNIT

答案 1 :(得分:0)

<块引用>

假设删除了 -fdefault-real-8 选项并在任何地方使用了 ISO_FORTRAN_ENV,有没有办法让程序中的任何常量表现得像每个常量都有 d0 后缀?

没有

顺便说一句,d0double precision 完全相同,因此也没有太大的吸引力,因为 double precision 的含义允许变化多达 {{ 1}}。

<块引用>

无论这是否可能,我是否正确推断我可以将以下几行放在一个模块中,该模块由所有其他程序单元使用,然后每个程序单元都可以使用 dp 作为类型参数?

是的。这是一种常见的做法。