2015-10-24 40 views
1

在下面的代碼中我加在一起865398.78和-865398.78。我期望得到0,但是我得到-0.03。Fortran無法在865398.78和-865398.78之間添加?爲什麼答案是-0.03?

The Fortran code and the result

源代碼:

​​

結果:

x= -865398.780000000  
x+865398.78= -3.000000002793968E-002 

我錯了以 「讀」 代碼或別的什麼用途?

+2

我已經內嵌了你的圖像,但是如果你可以將它轉換成純文本(你已經有源代碼在這裏,但輸入文件會更好的文本)可能會更好。我也已經把這個問題解釋爲了問題(並且假設你期望0作爲結果):如果你對我所做的不滿意,那麼你可以恢復我的編輯。 – francescalus

回答

5

數字865398.78在您的代碼中以單精度表示。單精度可以通過寫

x=x+865398.78_8 
+0

它的作品!非常感謝。 –

+3

在這個答案中,'8'是一種參數,通常是指雙精度。但雙精度是*不*總是8,而用8來定義雙精度已經過時了。 – Ross

+3

加上@Ross,'d0'將會是一個更合適的後綴,用於將數字轉換爲雙精度,即'865398.78d0'。 –

3

處理大約7顯著位數,而你的電話號碼有8可以讓雙精度我會做出這樣的回答一個big assumption:那real(8)對應double precision

您可能會認爲您的865398.78在任何地方都表示相同的東西。在真實的源代碼中:它是一個默認的真實文字常量,接近865398.78。

當你

x=x+865398.78 

x雙精度,則默認實常數被轉換爲雙精度值。

然而,在讀聲明

read(10,*)x 

給定輸入「-865398.78」然後x需要一個雙精度逼近該值。

你的非零答案來自一個事實,即將一個默認的實數/單精度逼近轉換爲雙精度值並不普遍,並且在這種情況下,與初始雙精度逼近不同。

最後這個事實在其他問題中有更詳細的解釋。正如使用x=x+865398.78_8(或更好的,不要使用8作爲種類值)的解決方案。

相關問題