我对Fortran很陌生,而且我正在玩#39;有功能。 我在一个非常简单的程序中发现了一个非常奇怪的行为,我无法以任何方式证明这一点。这是简单的代码:
Real*8 Function gamma(v)
Implicit None
Real*8 :: v
gamma = 1.0_8 / Sqrt(1.0_8 - v ** 2)
End Function gamma
Program test_gamma
Implicit None
Real*8 :: v = 0.5_8, gamma
print *,"Gamma = ", 1.0_8 / Sqrt(1.0_8 - v ** 2)
End Program
这会打印出确切的结果:1.1547005383792517
但如果我使用函数调用,进行相同的计算,print *,"Gamma = ", gamma(v)
我会得到意外的结果1.7724538509055161
。
我在这里缺少什么?
答案 0 :(得分:1)
值1.7724538509055161对应于参数0.5的(数学)伽马函数的(正确)结果。标准内在函数gamma
返回与此伽玛函数对应的结果。
在调用gamma
的程序中,您已声明gamma以返回real*8
结果,但您尚未将external
属性赋予它,或通过其他方式使接口可用。因此,内在是调用:在编译主程序时,编译器“知道”没有其他选择[如果你要求,我会期望在这种情况下编译器发出警告。]
我建议您将功能称为gamma
以外的其他功能,而不是添加external
属性。我甚至建议对于程序中有可用接口的函数。
通过“可用界面”,我的意思是你可以:
gamma
函数内部放入主程序; gamma
函数放入模块use
d; 有关详细信息,请参阅编程指南。
最后,我还建议另外一件事:没有real*8
。你可以在这里阅读很多评论。