2015-08-13 95 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