非常基本的Fortran問題拋NaN的。下面的函數返回爲NaN,我似乎無法找出原因:負指數中的Fortran
F_diameter = 1. - (2.71828**(-1.0*((-1./30.)**1.4)))
我已經美聯儲2.71 ...中,而不是使用exp()
但是均不能以同樣的方式。我注意到,當小數部分(-1/30)爲負時,我只能得到NaN。積極評價確定。
非常感謝
非常基本的Fortran問題拋NaN的。下面的函數返回爲NaN,我似乎無法找出原因:負指數中的Fortran
F_diameter = 1. - (2.71828**(-1.0*((-1./30.)**1.4)))
我已經美聯儲2.71 ...中,而不是使用exp()
但是均不能以同樣的方式。我注意到,當小數部分(-1/30)爲負時,我只能得到NaN。積極評價確定。
非常感謝
的問題是,你正在服用負數,這會給你一個複雜的答案的根源。如果你想象如果這更明顯
(-1) ** (3/2)
這相當於
(1/sqrt(-1))**3
換句話說,你的分數指數不能平凡的負數運行。
這裏有另一個有趣的一點,我今天學到的我想要添加到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
這遵循沿着引述的錯誤消息的線Fortran標準明確禁止。這與實施無關。 '(-23)** 6.0'也是不允許的。實際上,整數指數[非常特殊](http://stackoverflow.com/a/28908751)。 – francescalus
您正在使用什麼編譯器? –
我使用gfortran在OS X上 – micah
這個問題似乎是-1/30 ** 1.4;顯然gfortran沒有提高一個負數的分數。不知道爲什麼。 – micah