【问题标题】:Strange Function Call behavior奇怪的函数调用行为
【发布时间】:2015-01-27 01:17:44
【问题描述】:

我对 Fortran 很陌生,我正在“玩”函数。 我在一个非常简单的程序中发现了一个非常奇怪的行为,我无法以任何方式证明这一点。这是简单的代码:

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

我在这里错过了什么?

【问题讨论】:

  • 谢谢,是的,我在声明中添加了 gamma,Real*8 :: v = 0.5_8, gamma,但结果没有改变。我认为由于某种原因从未调用过该函数。

标签: fortran fortran90


【解决方案1】:

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

在您调用gamma 的程序中,您已声明gamma 以返回real*8 结果,但您尚未为其赋予external 属性,或通过其他方式提供接口。因此,内部函数改为调用:在编译主程序时,编译器“知道”别无选择[如果您要求,我希望在这种情况下出现编译器警告。]

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

“接口可用”是指您可以:

  • 把你的gamma函数internal放到主程序中;
  • 将您的gamma 函数放在主程序的模块used 中;
  • [提供接口块。]

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

最后,我还要推荐另一件事:不real*8。你可以在这里阅读很多关于这个的 cmets。

【讨论】:

  • 非常感谢!我不知道 Fortran 有内置的 gamma 函数。
  • 2008年标准新增。那么,从技术上讲,我的回答对于fortran90 不是那么有效。
  • 它仍然有效,该功能之前是一个常见的供应商扩展(标准允许),并且错误伤口的发生方式相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2019-06-03
  • 2011-06-14
  • 2020-01-31
相关资源
最近更新 更多