c   4.自然対数の底
c     森川 靖大  , 22980138
c
      program ex4
c
      implicit none
      integer :: i
      integer(8) ::fact
      real(4) :: ee(30),eea(30),eelog(30)
      real(8) :: ed(30),eda(30),edlog(30),d

c-----自然対数の底の真値
      d=dexp(1.0d0)

       ee(1)=1.0e0
       ed(1)=1.0d0
       do i=2,30
c---------自然対数の値
c-------------(dble は倍精度実数化の記号)
          ee(i)=ee(i-1)+1.0e0/float(fact(i-1))
          ed(i)=ed(i-1)+1.0d0/dble(fact(i-1))
c---------絶対誤差
          eea(i)=abs(d-ee(i))
          eda(i)=abs(d-ed(i))
c---------相対誤差
c          eer(i)=eea(i)/real(d)
c          edr(i)=eda(i)/d
       enddo
c------絶対誤差の自然対数の値(グラフ用)
       do i=2,17
          eelog(i)=log(abs(eea(i)))
          edlog(i)=dlog(abs(eda(i)))
       enddo
       do i=2,17
           write(10,*) i,eelog(i)
       enddo
       do i=2,17
           write(11,*) i,edlog(i)
       enddo

      stop
      end

c-----階乗の関数
      function fact(x)
       implicit none
       integer :: j
       integer(8) :: fact
       integer,intent(in) :: x
       fact=1
        do j=1,x
           fact=fact*j
        enddo
      return
      end