muzili2008 发表于 2014-11-26 08:53:46

用泰勒展开式计算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:19:13

本帖最后由 楚香饭 于 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

muzili2008 发表于 2014-11-26 09:58:17

楚香饭 发表于 2014-11-26 09:19
分子分母都趋于无穷大,分母具有更高阶的无穷大,这种时候你可以用一个临时变量来取其商。例如下面代码的 t ...

多谢 多谢了!!

爷且无辜 发表于 2014-11-26 16:42:39

楼主这个代码运行速度不如“楚香饭”(这个人貌似是坛主??!!)这个代码,楼主这个代码对之前计算结果的利用率不高,可以说直接没利用,而楚香饭这个每次计算下一项的值的时候都用到了之前的值,而不是从头计算,计算量更小,速度更快

楚香饭 发表于 2014-11-26 22:08:23

爷且无辜 发表于 2014-11-26 16:42
楼主这个代码运行速度不如“楚香饭”(这个人貌似是坛主??!!)这个代码,楼主这个代码对之前计算结果的 ...

幸会幸会,我就是坛主。咳,不好意思老用管理员账号....让人看了有点疏远的感觉,所以有个普通号

爷且无辜 发表于 2014-11-27 09:45:30

楚香饭 发表于 2014-11-26 22:08
幸会幸会,我就是坛主。咳,不好意思老用管理员账号....让人看了有点疏远的感觉,所以有个普通号 ...

你这普通账号也能看出来是你啊,基本上所有的帖子都是你在解决问题(当然也有很多版主在解决大家的问题),我只是来打打酱油的

百事可乐 发表于 2014-11-29 10:53:58

我也早就看出来沙发是坛主了{:3_52:}
页: [1]
查看完整版本: 用泰勒展开式计算E**x的值