Fortran 奇怪的函数调用行为
我对Fortran还很陌生,我在“玩”函数。 我在一个非常简单的程序中发现了一个非常奇怪的行为,我无法以任何方式证明它是正确的。下面是简单的代码:Fortran 奇怪的函数调用行为,fortran,fortran90,Fortran,Fortran90,我对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 pr
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.7724538509055161对应于参数为0.5的(数学)伽马函数的(正确)结果。标准内在函数
gamma
返回与此gamma函数对应的结果
在调用gamma
的程序中,您已声明gamma返回real*8
结果,但未将external
属性赋予它,也未通过其他方式提供接口。因此,本质上是被调用的:编译主程序时,编译器“知道”没有其他选择[如果你要求的话,我希望在这种情况下编译器会发出警告。]
我建议您调用函数而不是gamma
,而不是添加external
属性。我甚至建议,对于程序中有接口的函数
“接口可用”,我的意思是您可以:
- 将
函数放在主程序内部李>gamma
- 将您的
函数放在主程序使用的模块gamma
中李>
- [提供一个接口块。]
最后,我还要推荐另外一件事:no
real*8
。你可以在这里看到很多关于这方面的评论。谢谢,是的,我在声明中添加了gamma,Real*8::v=0.5_8,gamma
,但结果没有改变。我想这个函数从来没有因为某种原因被调用过。非常感谢!我不知道Fortran有一个内置的gamma函数,它是2008年标准中新增的。从技术上讲,我的答案对的不是那么有效。它仍然有效,函数以前是一个通用的供应商扩展(这是标准允许的),错误也会以同样的方式发生。