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

Read a floating point data with F descriptor

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

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

意外行为是因为输入字段 38 没有小数点。你可以看到这与其他所有不同。

为什么这是个问题?让我们看一下 F 编辑描述符和 Fw.d 是如何为输入描述的(Fortran 2008,10.7.2.3.2):

If the decimal symbol is omitted, the rightmost d digits of the string, with leading zeros assumed if necessary, are interpreted as the fractional part of the value represented.

对于您的编辑 F16.11,小数部分由 11 位数字组成。这导致 3.8e-10.

处理此问题的一个简单方法是确保所有浮点字段都包含小数点符号。


作为最简单的方法实际上是修改编辑以使用F16.0。这是从我引用的那句话之前的句子得出的:

The d has no effect on input if the input field contains a decimal symbol.

所以,用0作为input的小数位宽,得到了想要的结果:当有小数符号时,这里的值0被忽略;如果没有,则与小数部分相同。对于输出,您仍然可以使用现有的格式。只是输入出错了。

在我看来,在 F 编辑描述符中没有地方可以使用非零输入。对于输出控制小数位数是有用的,但是对于输入是有害的。

正如 francescalus 在他的回答中显示的那样,(Fw.d) 值中的 d 导致没有小数符号的文字被解释为按 10^d 缩放。

解决方案是只使用 F16.0 而不是 F16.11。非零 d 部分是完全不必要且有害的。它只有一些奇怪的用例,但这里没有。