使用 P 描述符写入 stdout 的第二个实数是错误的 10 倍

Second real written to stdout with the P descriptor is wrong by factor 10

这是一个最小的工作示例:

program test_stuff

  implicit none

  real :: b

  b = 10000.0

  write(*,'(A10,1PE12.4,F12.4)')  "b, b:     ", b, b

end program

我只是用gfortran test_stuff.f90 -o test_stuff

编译

但是,运行程序给出了以下输出:

$ ./test_stuff
b, b:       1.0000E+04 100000.0000

写到屏幕上的第二个实数是错误的 10 倍。

gfotran 9.3.0 和 10.2.0 都会发生这种情况,所以我肯定做错了什么,但我看不出是什么。有人能发现我做错了什么吗?

P控件编辑描述符“暂时更改”(Fortran 2018 13.8.5)连接的比例因子连接模式。

但是,temporary的意思是直到模式再次改变或者直到数据传输语句结束:(Fortran 2018 12.5.2)

Edit descriptors take effect when they are encountered in format processing. When a data transfer statement terminates, the values for the modes are reset to the values in effect immediately before the data transfer statement was executed.

在问题的情况下,两个输出值都使用值为 1 的比例因子进行处理。

这个比例因子是“错误的”第二个值的原因:EF 编辑对比例因子的解释不同。对于 E 编辑比例因子只是改变表示,外部和内部值相同(尾数按比例增加 10,指数减少 1),但对于 F 编辑输出值本身是缩放的:

On output, with F output editing, the effect is that the externally represented number equals the internally represented number multiplied by 10k

因此,虽然在 E12.4 下,10000 将由比例因子为 0 的 0.1000E+05 和比例因子为 1 的 1.0000E+04 表示,但在 F12.4 下,值 10000 被缩放为100000 比例因子到位。


作为样式注释:虽然逗号在 1PE12.4(以及类似的)之间是可选的,但许多人认为包含逗号会更好,正是为了避免这种明显的紧耦合两个描述符之一(或看起来像一个描述符)。由于比例因子对 EF 有不同的影响,对 EN 没有影响,有时但不总是对 G 有影响,我是不会与任何称 P 邪恶的人争论。

您正在查找 Fortran 2018 标准的第 12.5.2 节。

格式化 input/output 的连接有几种可变模式:这些是 ... 和比例因子 (13.8.5)。

连接模式的值是在连接启动时建立的。如果连接由 OPEN 语句启动,则值由 OPEN 语句明确或隐式指定。如果连接不是由 OPEN 语句启动的(即,如果文件是内部文件或预连接文件),则建立的值是那些没有相应关键字的初始 OPEN 语句所暗示的值。

不能在 OPEN 语句中显式指定比例因子;它隐式为 0.

可以通过...或编辑描述符临时更改连接模式。 ... 编辑描述符在格式处理中遇到时生效。当数据传输语句终止时,模式的值将重置为数据传输语句执行前立即生效的值。

因此,当您在格式中使用 1P 时,您更改了连接模式。这适用于 1P 处理后的所有输出项。当写入语句完成时,比例因子重置为 0。