我有一个以下格式的数据文件:
76 1 28.19345173 20.57121917 21.66248682
77 1 30.48106325 37.84001977 19.95790222
78 1 30.49966847 38 20.68928893
79 1 1.246861056 0.6998957711 34.74201206
我需要对此数据文件进行一些操作。因此,我开始编写代码来读取数据文件的最后4列。这是我用来读取所需信息并将其写入新文件的格式:
阅读格式:
format(21x,f16.11,10x,f16.11,10x,f16.11)
写作格式:
format(A1,1x,f16.11,5x,f16.11,5x,f16.11)
A1自动设为1。 我的代码输出是:
1 28.19345173000 20.57121917000 21.66248682000
1 30.48106325000 37.84001977000 19.95790222000
1 30.49966847000 0.00000000038 20.68928893000
1 1.24686105600 0.69989577110 34.74201206000
正如您可以很容易地看到我的问题在于第三行中的38,其读写为0.00000000038
。任何人都可以帮助我找出解决问题的最佳方法吗?
答案 0 :(得分:3)
在我看来,在F
编辑描述符中没有地方使用非零作为输入。对于输出,控制小数位数很有用,但它对输入有害。
正如francescalus在他的回答中所示,d
in(Fw.d
)值导致没有小数符号的文字被解释为缩放10 ^ d。
解决方案是使用F16.0
而不是F16.11
。非零d
部分完全没有必要且有害。它只有一些奇怪的用例,但你没有它们。
答案 1 :(得分:0)
意外行为来自输入字段38
没有小数符号的事实。你可以看到这与其他所有不同。
为什么这是一个问题?让我们看看F
编辑描述符如何用Fw.d
描述输入(Fortran 2008,10.7.2.3.2):
如果省略小数符号,则字符串最右边的d位数(如果需要,假定前导零)被解释为所表示值的小数部分。
对于您的编辑F16.11
,小数部分由11位数组成。这会导致3.8e-10
。
处理此问题的一种简单方法是确保所有浮点字段都包含小数符号。
作为Vladimir F points out,最简单的方法是修改编辑以使用F16.0
。这是从我引用的句子之前的句子开始的:
如果输入字段包含小数符号,则d对输入没有影响。
因此,使用0
作为输入中的小数宽度具有所需的结果:当存在小数符号时,此处的值0
为忽略;如果没有,则与分数部分相同。对于输出,您仍然可以使用您拥有的格式。这只是输入错误。