Fortran 如何在代码中实现阶乘函数?
所以我使用泰勒级数来计算fortran 90中的sin(0.75),直到某一点,所以我需要在do while循环中运行它(直到满足我的条件)。这意味着我需要使用阶乘,以下是我的代码: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)
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的重复调用也会被忽略,但我可能错了。嗨,谢谢你的回复。如何在代码中实现此函数?谢谢