使用F描述符读取浮点数据

时间:2015-08-13 07:47:08

标签: formatting fortran

我有一个以下格式的数据文件:

   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。任何人都可以帮助我找出解决问题的最佳方法吗?

2 个答案:

答案 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为忽略;如果没有,则与分数部分相同。对于输出,您仍然可以使用您拥有的格式。这只是输入错误。