在Fortran中投掷NaN的否定指数

时间:2011-11-29 16:33:24

标签: math fortran

非常基本的Fortran问题。以下函数返回NaN,我似乎无法弄清楚原因:

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

我已经喂了2.71 ...而不是使用exp(),但他们都以同样的方式失败了。我注意到当小数部分(-1 / 30)为负时我只得到一个NaN。积极评估好。

非常感谢

2 个答案:

答案 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