2012-04-04 96 views
2

我一直在嘗試使用Fortran的我的研究項目,與GNU Fortran編譯(gfortran),最新版本, 但我已經遇到的方式存在一些問題,它處理實際數字。如果你有一個例子代碼:精度問題的Fortran

program test 
implicit none 

real :: y = 23.234, z 

z = y * 100000 
write(*,*) y, z 

end program 

你會得到作爲輸出:

23.23999 2323400.0 

我覺得這很奇怪。 有人能告訴我這裏到底發生了什麼嗎?看着z我可以看到y確實保留了它的精確度,所以對於我認爲不應該成爲問題的計算來說。但爲什麼y的輸出與我指定的值不完全相同,我該怎麼做才能使它完全一樣?

+6

您正在使用單精度IEEE-754浮點數 - 閱讀此:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – 2012-04-04 17:36:54

回答

2

只需將real替換爲double precision,即可在大多數平臺上將重要小數位數從大約6增加到大約15。

+0

@HighPerformanceMark :(編輯答案)那是更好? – wallyk 2012-04-04 20:12:02

+0

是............ – 2012-04-04 21:13:53

1

的一般問題不限於Fortran的,但是在有限精度另一基座底座10的實數表示。這個計算機科學問題在這裏被問了很多次。

對於具體的Fortran方面,宣言「真正的」將可能給你一個單精度浮點。如果沒有類型限定詞將常量表示爲「23.234」。常數「100000」不帶小數點的是這樣的表述「Y * 100000」導致一個真正的整數的一個隱式轉換,因爲「y」爲實數變量的整數。

對於以前的以前對這些問題的一些討論見Extended double precisionFortran: integer*4 vs integer(4) vs integer(kind=4)Is There a Better Double-Precision Assignment in Fortran 90?

1

這裏的問題是不是與Fortran語言,其實它是沒有問題的。這只是浮點運算的一個特性。如果你考慮如何以二進制表示23.234作爲'單一浮點數',你會發現數字必須保存爲精確度的小數。

關於浮點數的事情要記住的是:看起來很圓,甚至以10爲底的數字可能不會是二進制

對於浮點主題的簡要概述,檢查Wikipedia文章。對於一個非常詳盡的解釋,請查看Goldberg(PDF)的規範paper