【发布时间】:2014-03-12 11:29:08
【问题描述】:
我有一个需要修改的 Fortran 程序,所以我正在阅读它并试图理解它。您能否解释一下以下语句中的格式化字符串的含义:
write(*,'(1p,(5x,3(1x,g20.10)))') x(jr,1:ncols)
【问题讨论】:
标签: formatting fortran fortran95
我有一个需要修改的 Fortran 程序,所以我正在阅读它并试图理解它。您能否解释一下以下语句中的格式化字符串的含义:
write(*,'(1p,(5x,3(1x,g20.10)))') x(jr,1:ncols)
【问题讨论】:
标签: formatting fortran fortran95
http://www.fortran.com/F77_std/rjcnf0001-sh-13.html
简而言之,您正在每行编写三个通用 (g) 格式的浮点数。每个浮点数的总字段宽度为 20 个字符和小数点右侧 10 位。大数是指数形式的。
1xs 只是简单地添加了空格(这也可以通过增加字段宽度来实现,即g21.10,因为数字是右对齐的。5x 在开头添加了 5 个空格每一行。
这里有点棘手的是领先1p,这是一个比例因子。它使以下g格式产生的所有指数形式数的尾数乘以10,指数也相应改变,即代替默认值,
g17.10 -> b0.1234567890E+12
你得到:
1p,g17.10 -> b1.2345678900E+11
b 表示输出中的空白。请务必在字段宽度计数中为 - 留出空间...
为了在比例大于一的情况下保持完整性,减少小数位数(保持总精度),即,
3p,g17.10 -> b123.45678900E+09 ! note only 8 digits after the decimal
即1p 为您购买了比默认值更高的精度,但您不再获得更多。负比例会降低您的精度,保留 10 位数字:
-7p,g17.10 -> b0.0000000123E+19
我应该补充一点,p 比例因子编辑描述符在输入时完全不同。阅读文档...
【讨论】:
我想稍微补充一下乔治的回答。不幸的是,这是 Fortran 的一个非常讨厌的 (IMO) 部分。通常,请记住,只要输入/输出列表中还有剩余值,就会自动重复 Fortran 格式规范,因此不必为每个要处理的值提供格式。
在输出中,kP 之后的所有浮点值都乘以 10k。包含指数 (E) 的字段的指数减少了 k,除非通过使用 EN(工程)或 来固定指数格式ES(科学)描述符。缩放不适用于 G 编辑,除非 该值适用于 E 编辑。因此,(1P,G20.10) 和 (1P,F20.10) 之间存在差异。
像 n() 这样的格式在继续之前重复括号内的描述符 n 次。
【讨论】:
EN 和ES 可用,我不再使用G。 IMO,在此之前,修改E 很有用。 G 真的很危险;正如另一个答案中提到的,它的行为在输出和输入之间是不同的!
open、read 和write 的所有参数...我喜欢 Fortran,但不是这部分:P