非常基本的Fortran问题。以下函数返回NaN,我似乎无法弄清楚原因:
F_diameter = 1. - (2.71828**(-1.0*((-1. / 30.)**1.4)))
我已经喂了2.71 ...而不是使用exp()
,但他们都以同样的方式失败了。我注意到当小数部分(-1 / 30)为负时我只得到一个NaN。积极评估好。
非常感谢
答案 0 :(得分:10)
问题在于你正在使用负数的根,这会给你一个复杂的答案。如果你想象,这就更明显了。
(-1) ** (3/2)
相当于
(1/sqrt(-1))**3
换句话说,您的小数指数不能轻易地对负数进行操作。
答案 1 :(得分: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