Math Fortran中的负指数
非常基本的Fortran问题。下面的函数返回一个NaN,我似乎不明白为什么:Math Fortran中的负指数,math,fortran,Math,Fortran,非常基本的Fortran问题。下面的函数返回一个NaN,我似乎不明白为什么: F_直径=1(2.71828**(-1.0*(-1./30.**1.4)) 我喂了2.71。。。在中而不是使用exp(),但它们都以相同的方式失败。我注意到,只有当小数部分(-1/30)为负时,才会得到NaN。积极的评价是好的 非常感谢问题是你在取一个负数的根,这会给你一个复杂的答案。如果你想象一下,这一点会更明显 (-1) ** (3/2) 这相当于 (1/sqrt(-1))**3 换句话说,分数指数不能简单地对
F_直径=1(2.71828**(-1.0*(-1./30.**1.4))
我喂了2.71。。。在中而不是使用exp()
,但它们都以相同的方式失败。我注意到,只有当小数部分(-1/30)为负时,才会得到NaN。积极的评价是好的
非常感谢问题是你在取一个负数的根,这会给你一个复杂的答案。如果你想象一下,这一点会更明显
(-1) ** (3/2)
这相当于
(1/sqrt(-1))**3
换句话说,分数指数不能简单地对负数进行运算。我今天学到了另一个有趣的点,我想补充一下ire_和_诅咒的答案:fortran编译器似乎可以通过连续乘法计算整数的幂。 比如说
PROGRAM Test
PRINT *, (-23) ** 6
END PROGRAM
工作正常,并给出148035889
作为答案
但是对于实数
指数,编译器使用对数: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
从数学的角度来看,这个问题似乎也很有趣:这个问题似乎是-1/30**1.4;显然,gfortran无法将负数提高到分数次幂。不知道为什么。愤怒和诅咒给出了一个很好的答案。请注意,这应该是所有Fortran编译器的标准行为-因为Fortran是静态类型的,在对其进行操作时,REAL不能变为COMPLEX-但它会引发异常。这是因为Fortran标准中明确禁止引用错误消息。它实际上与实现无关<代码>(-23)**6.0也是不允许的。事实上,整数指数是。