如何在代码中实现阶乘函数?

you*_*man 4 fortran gfortran fortran90

因此,我使用泰勒级数在 Fortran 90 中计算 sin(0.75) 直到某个点,因此我需要在 do while 循环中运行它(直到满足我的条件)。这意味着我需要使用阶乘,这是我的代码:

program taylor
implicit none
real :: x = 0.75  
real :: y
integer :: i = 3
do while (abs(y - sin(0.75)) > 10.00**(-7)) 
 i = i + 2
 y = x - ((x**i)/fact(i))
 print *, y
end do
end program taylor
Run Code Online (Sandbox Code Playgroud)

我写fact(i)的地方就是我需要阶乘的地方。不幸的是,Fortran 没有内在函数!功能。我该如何实现这个程序中的功能?

谢谢。

A. *_*ink 5

以下简单的函数可以回答您的问题。请注意它如何返回 a real,而不是整数。如果性能不是问题,那么这对于泰勒级数来说就很好。

real function fact(n)
  integer, intent(in) :: n

  integer :: i

  if (n < 0) error stop 'factorial is singular for negative integers'
  fact = 1.0
  do i = 2, n
    fact = fact * i
  enddo
end function fact
Run Code Online (Sandbox Code Playgroud)

但真正的答案是 Fortran 2008确实有一个阶乘的内在函数:Gamma 函数。对于正整数n,其定义为Gamma(n+1) == fact(n)

(我可以想象Gamma 函数是陌生的。它是阶乘函数的泛化:Gamma(x)为所有复数定义x,除了非正整数。定义中的偏移量是出于历史原因,并且不必要地混淆你问我的情况。)

在某些情况下,您可能希望将 Gamma 函数的输出转换为整数。INT(Gamma(n+1), kind=INT64)如果是这样,请确保在声明中使用“长整数”via USE, INTRINSIC :: ISO_Fortran_env。这是防止阶乘变得很大的预防措施。并且,一如既往,请注意混合模式算术!