使用 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
部分是完全不必要且有害的。它只有一些奇怪的用例,但这里没有。
我有一个格式如下的数据文件:
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
部分是完全不必要且有害的。它只有一些奇怪的用例,但这里没有。