非常基本的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