用泰勒展开式计算E**x的值
大家好,请教的问题如下:{e}^{x}=1+x+\frac{{x}^{2}}{2!}+\frac{{x}^{3}}{3!}+\frac{{x}^{4}}{4!}+...
计算上面的问题,我写的代码如下:
PROGRAM MAIN
IMPLICIT NONE
REAL X,S
INTEGER*8 N
INTEGER I
INTEGER,EXTERNAL :: FACT
READ(*,*) N
READ(*,*) X
S=0
DO 10 I=2,N
S=S+X**I/FACT(I)
WRITE(*,*) I,FACT(I),X**I,
10 CONTINUE
S=S+X+1
WRITE(*,*) S
END
RECURSIVE INTEGER FUNCTION FACT(N) RESULT(ANS)
IMPLICIT NONE
INTEGER,INTENT(IN) :: N
IF(N>1) THEN
ANS=N*FACT(N-1)
RETURN
END IF
ANS=1
RETURN
END
出现的问题是:计算中fact(阶乘项)的值出现溢出的情况,这种问题如何解决呢? 本帖最后由 楚香饭 于 2014-11-26 09:28 编辑
分子分母都趋于无穷大,分母具有更高阶的无穷大,这种时候你可以用一个临时变量来取其商。例如下面代码的 t,同时还可以避免 x**i 和阶乘。
Program main
Implicit None
real x,s,t
integer n
integer i
read(*,*) n
read(*,*) x
t = x
s = x + 1
Do i=2,n
t = t*x/i
s = s + t
End Do
write(*,*) s
End Program main 楚香饭 发表于 2014-11-26 09:19
分子分母都趋于无穷大,分母具有更高阶的无穷大,这种时候你可以用一个临时变量来取其商。例如下面代码的 t ...
多谢 多谢了!! 楼主这个代码运行速度不如“楚香饭”(这个人貌似是坛主??!!)这个代码,楼主这个代码对之前计算结果的利用率不高,可以说直接没利用,而楚香饭这个每次计算下一项的值的时候都用到了之前的值,而不是从头计算,计算量更小,速度更快 爷且无辜 发表于 2014-11-26 16:42
楼主这个代码运行速度不如“楚香饭”(这个人貌似是坛主??!!)这个代码,楼主这个代码对之前计算结果的 ...
幸会幸会,我就是坛主。咳,不好意思老用管理员账号....让人看了有点疏远的感觉,所以有个普通号 楚香饭 发表于 2014-11-26 22:08
幸会幸会,我就是坛主。咳,不好意思老用管理员账号....让人看了有点疏远的感觉,所以有个普通号 ...
你这普通账号也能看出来是你啊,基本上所有的帖子都是你在解决问题(当然也有很多版主在解决大家的问题),我只是来打打酱油的 我也早就看出来沙发是坛主了{:3_52:}
页:
[1]