2015-08-13 97 views
1

浮点数据我有一个数据文件的格式如下:阅读使用F描述

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 

正如你可以很容易地看到我的问题在于读取和写入为0.00000000038的第三行中的38。任何人都可以帮助我找出解决问题的最佳方法吗?

回答

3

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

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

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

+0

尊敬的弗拉德米尔, 尊重,你根本没有得到这个问题,零d是不工作,阅读和写所有的元素! 对不起,但你的答案根本没有解决我的问题。 –

+0

@ H.RJ对于输出,不要使用'F16.0',但是不管你想要什么。 – francescalus

+0

我尊敬的朋友, 我完全理解它。我认为你没有得到我的主要关注:-)! 我只是想学习fortran,我想知道fortran是否能够在用户需要或不需要时从f16.11切换到f16.0。 对不起,但我不是以最简单的方式找到解决方案,但尝试学习! –

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这里是忽略;当没有时,这与小数部分相同。对于输出,您仍然可以使用该格式。这只是输入错误。

+0

非常感谢您的回答。我正在处理数百万的元素。没有办法确保所有元素是否包含小数点符号。假设所有的元素都有十进制符号,除了这个符号,你最好回答的基本意思是没有办法报告没有小数符号的数字。对? –

+0

换句话说,读取其中一些包含十进制符号而另一些不包含的元素的最佳方式是什么? –

+1

如果你不想改变数据文件(这是合理的),那么你也可以看看使用列表控制输入('read(...,fmt = *)')而不是显式格式。这是一个妥协(请参阅其他问题),但是如果您相信该文件以其他方式呈现良好,则可能是一种简单的方法。除此之外,可以做更多的解析输入行的努力(其他问题也可以)。 – francescalus