奇怪的函数调用行为

时间:2014-11-28 11:24:54

标签: fortran fortran90

我对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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

值1.7724538509055161对应于参数0.5的(数学)伽马函数的(正确)结果。标准内在函数gamma返回与此伽玛函数对应的结果。

在调用gamma的程序中,您已声明gamma以返回real*8结果,但您尚未将external属性赋予它,或通过其他方式使接口可用。因此,内在是调用:在编译主程序时,编译器“知道”没有其他选择[如果你要求,我会期望在这种情况下编译器发出警告。]

我建议您将功能称为gamma以外的其他功能,而不是添加external属性。我甚至建议对于程序中有可用接口的函数。

通过“可用界面”,我的意思是你可以:

  • 将您的gamma函数内部放入主程序;
  • 通过主程序将gamma函数放入模块use d;
  • [提供接口块。]

有关详细信息,请参阅编程指南。

最后,我还建议另外一件事:没有real*8。你可以在这里阅读很多评论。