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

Fortran 如何在代码中实现阶乘函数?,fortran,gfortran,fortran90,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)

所以我使用泰勒级数来计算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
我写事实(i)的地方就是我需要阶乘的地方。不幸的是,Fortran没有内在的!功能。我将如何实现此程序中的功能


谢谢。

你能写出给出阶乘的方程式吗? 它可能看起来像这样

PURE FUNCTION Bang(N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: N
INTEGER             :: I
INTEGER             :: Bang

Bang = N
IF(N == 2) THEN
  Bang = 2
ELSEIF(N == 1) THEN
  Bang = 1
ELSEIF(N < 1) THEN
  WRITE(*,*)'Error in Bang function N=',N
  STOP
ELSE
  DO I = (N-1), 2, -1
    Bang = Bang * I
  ENDDO
ENDIF

RETURN
END FUNCTION Bang
纯函数Bang(N)
隐式无
整数,意图(IN)::N
整数::I
整数::Bang
Bang=N
如果(N==2),则
爆炸=2
ELSEIF(N==1)则
Bang=1
ELSEIF(N<1)则
Bang函数N='中的写入(*,*)'错误,N
停止
其他的
我是不是=(N-1),2,-1
砰=砰*I
恩多
恩迪夫
返回
端函数爆炸

您不希望对泰勒级数使用阶乘函数。这意味着要反复计算相同的术语。您应该只在每个循环迭代中乘以阶乘变量。不要忘记使用
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
实函数事实(n)
整数,意图(in)::n
整数::i
如果(n<0)错误停止“阶乘对于负整数是奇异的”
事实=1.0
i=2,n吗
事实=事实*i
结束循环
终端功能事实
但真正的答案是Fortran 2008确实具有阶乘的内在函数:。对于正整数
n
,定义为
Gamma(n+1)=事实(n)

(我可以想象这个函数是不熟悉的。它是阶乘函数的推广:
Gamma(x)
是为所有复杂的
x
定义的,除了非正整数。定义中的偏移量是出于历史原因,不必要地混淆了它,你问我。)


在某些情况下,您可能希望将Gamma函数的输出转换为整数。如果是这样,请确保通过
INT(Gamma(n+1),kind=INT64)
use,instructive::ISO\u Fortran\u env
声明使用“长整数”。这是防止阶乘变得相当大的预防措施。和往常一样,注意混合模式算法

这是另一种计算n的方法!在一行中仅使用内联函数:

product((/(i,i=1,n)/))

当然,我必须事先声明为整数。它创建一个从1到n的数组,并获取所有组件的乘积。奖励:它甚至可以为n=0提供正确的东西

此函数存在一些问题。(1) 它不会编译,不允许从
pure
过程写入控制台。(2) 它只能在非常有限的输入范围内正常工作(作为读者的练习,找出限制的程度),并且(3)
stop
语句停止程序调用函数,这有点激烈。噢,
factorial(0)
被定义为等于
1
,并且不应该导致这种类型的函数崩溃。我希望对gamma的重复调用也会被忽略,但我可能错了。嗨,谢谢你的回复。如何在代码中实现此函数?谢谢