2011-11-29 31 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