2011-11-29 43 views
3

非常基本的Fortran問題拋NaN的。下面的函數返回爲NaN,我似乎無法找出原因:負指數中的Fortran

F_diameter = 1. - (2.71828**(-1.0*((-1./30.)**1.4)))

我已經美聯儲2.71 ...中,而不是使用exp()但是均不能以同樣的方式。我注意到,當小數部分(-1/30)爲負時,我只能得到NaN。積極評價確定。

非常感謝

+0

您正在使用什麼編譯器? –

+0

我使用gfortran在OS X上 – micah

+1

這個問題似乎是-1/30 ** 1.4;顯然gfortran沒有提高一個負數的分數。不知道爲什麼。 – micah

回答

10

的問題是,你正在服用負數,這會給你一個複雜的答案的根源。如果你想象如果這更明顯

(-1) ** (3/2) 

這相當於

(1/sqrt(-1))**3 

換句話說,你的分數指數不能平凡的負數運行。

0

這裏有另一個有趣的一點,我今天學到的我想要添加到ire_and_curses回答:Fortran編譯器似乎計算與連續的乘法整數權力。 例如

 PROGRAM Test 
     PRINT *, (-23) ** 6 
     END PROGRAM 

做工精細,並給出148035889作爲一個答案。

但是對於REAL指數,編譯器使用對數:y**x = 10**(x * log(y))(今天的編譯器可能會有所不同,但我的書是這麼說的)。現在,負對數給一個複雜的結果,這並不工作:

 PROGRAM Test 
     PRINT *, (-23) ** 6.1 
     END PROGRAM 

,甚至給出了一個編譯器錯誤:

Error: Raising a negative REAL at (1) to a REAL power is prohibited 

從一個角度數學的角度,這個問題似乎也很有意思: https://math.stackexchange.com/questions/1211/non-integer-powers-of-negative-numbers

+1

這遵循沿着引述的錯誤消息的線Fortran標準明確禁止。這與實施無關。 '(-23)** 6.0'也是不允許的。實際上,整數指數[非常特殊](http://stackoverflow.com/a/28908751)。 – francescalus