2014-12-03 143 views
0

我決定在這裏發帖,因爲我正在用我的fortran90代碼面對一個非常奇怪的麻煩。 事實上,我宣佈雙精度變量,即:Fortran問題0 + 0不等於0

double precision, dimension(-1:20,-1:20) :: a,b,c 

然後我初始化所有變量到零,

a(:,:) = 0.d0 
b(:,:) = 0.d0 
c(:,:) = 0.d0 

最後,我做我的計算,

a(1:17,2:18) = a(1:17,2:18) + b(1:17,2:18) + 0.5d0*c(1:17,2:18) 

我檢查了每變量,並且在計算之前它們全部等於零,但是然後我獲得,

abs(maxval(a(1:17,2)) - minval(a(1:17,2))) = 4.336808689942018E-019 

這沒有任何意義,但我不知道問題來自哪裏,有人可以幫我解決這個問題嗎?

問候

PS:我使用ifort有以下選項:「-O3 -xHost -vec-report0 -implicitnone -warn truncated_source -warn argument_checking -warn未使用-warn聲明-warn路線-warn ignore_loc -warn usage -check nobounds -ftz「

+0

可能重複(http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – 2014-12-03 11:02:34

+0

或者:https://開頭計算器.com/questions/21895756 /爲什麼是浮點數 - 不準確 – 2014-12-03 11:03:59

+3

如果你可以將它轉換成一個複製/粘貼的可編譯的例子,這將是有用的。但我無法使用推斷程序進行復制。 – francescalus 2014-12-03 11:41:01

回答

0

我在MS Visual Studio 2005(英特爾Fortran 11.0.3452.2005)上運行了你的代碼片段,得到了0.000000000000000E + 000。 GNU Fortran 4.9.0的結果相同。

不知道它是否會對您的情況產生影響,但我可以建議您使用DABS而不是ABS。

福斯托

的[是浮點運算壞了嗎?]
+2

總是最好使用通用的內部函數,然後讓編譯器決定如何處理操作。 – 2014-12-03 19:00:44

+0

同意Joel,通用'abs'是更好的風格。 – 2014-12-03 19:20:20

+0

我認爲這是個人策略/品味的問題,但我永遠不要讓編譯器決定我編寫的程序語句更好。有時候這也是一個好主意:如果我使用雙精度內部函數並得到一個錯誤,這表明我在某處搞砸了,而且我的代碼需要修補。 – 2014-12-03 20:18:17