使用 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
的比例因子进行处理。
这个比例因子是“错误的”第二个值的原因:E
和 F
编辑对比例因子的解释不同。对于 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 比例因子到位。
作为样式注释:虽然逗号在 1P
和 E12.4
(以及类似的)之间是可选的,但许多人认为包含逗号会更好,正是为了避免这种明显的紧耦合两个描述符之一(或看起来像一个描述符)。由于比例因子对 E
和 F
有不同的影响,对 EN
没有影响,有时但不总是对 G
有影响,我是不会与任何称 P
邪恶的人争论。
您正在查找 Fortran 2018 标准的第 12.5.2 节。
格式化 input/output 的连接有几种可变模式:这些是 ... 和比例因子 (13.8.5)。
连接模式的值是在连接启动时建立的。如果连接由 OPEN 语句启动,则值由 OPEN 语句明确或隐式指定。如果连接不是由 OPEN 语句启动的(即,如果文件是内部文件或预连接文件),则建立的值是那些没有相应关键字的初始 OPEN 语句所暗示的值。
不能在 OPEN 语句中显式指定比例因子;它隐式为 0.
可以通过...或编辑描述符临时更改连接模式。 ... 编辑描述符在格式处理中遇到时生效。当数据传输语句终止时,模式的值将重置为数据传输语句执行前立即生效的值。
因此,当您在格式中使用 1P
时,您更改了连接模式。这适用于 1P
处理后的所有输出项。当写入语句完成时,比例因子重置为 0。
这是一个最小的工作示例:
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
的比例因子进行处理。
这个比例因子是“错误的”第二个值的原因:E
和 F
编辑对比例因子的解释不同。对于 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 比例因子到位。
作为样式注释:虽然逗号在 1P
和 E12.4
(以及类似的)之间是可选的,但许多人认为包含逗号会更好,正是为了避免这种明显的紧耦合两个描述符之一(或看起来像一个描述符)。由于比例因子对 E
和 F
有不同的影响,对 EN
没有影响,有时但不总是对 G
有影响,我是不会与任何称 P
邪恶的人争论。
您正在查找 Fortran 2018 标准的第 12.5.2 节。
格式化 input/output 的连接有几种可变模式:这些是 ... 和比例因子 (13.8.5)。
连接模式的值是在连接启动时建立的。如果连接由 OPEN 语句启动,则值由 OPEN 语句明确或隐式指定。如果连接不是由 OPEN 语句启动的(即,如果文件是内部文件或预连接文件),则建立的值是那些没有相应关键字的初始 OPEN 语句所暗示的值。
不能在 OPEN 语句中显式指定比例因子;它隐式为 0.
可以通过...或编辑描述符临时更改连接模式。 ... 编辑描述符在格式处理中遇到时生效。当数据传输语句终止时,模式的值将重置为数据传输语句执行前立即生效的值。
因此,当您在格式中使用 1P
时,您更改了连接模式。这适用于 1P
处理后的所有输出项。当写入语句完成时,比例因子重置为 0。