      !newton法の計算2
      !f(kai) = x^5 - 7x^4 + 16x^3 - 8x^2 -16x +16  = 0
      program newton

      implicit none
      integer :: i                                                     !ループ回数
      real :: kai                                                      !初期値-4.5e0の解
      real :: kai2                                                     !初期値5.0e0の解
      real :: f                                                        !方程式f(kai)
      real :: df                                                       !fの微分
      real :: deruta                                                   !kai2の計算誤差

      read(5,*) kai, kai2 

      i = 0
! -----------------------無限ループ:ここから ------------------------------ 
  18  continue
         
        write(*,*) i, '|', kai, '|',  f(kai), '|', kai2, '|',  f(kai2),&
                   '|', deruta 
         kai = kai - f(kai)/df(kai)                                     !kaiに対する反復法
         kai2 = kai2 - f(kai2)/df(kai2)                                 !kai2に対する反復法
         i = i + 1
      deruta = 3.0e0*abs(16.0e0*(kai2**3.0e0))*0.5e0*(10.0e0**(-6.0e0)) !kai2 ～ 2の時の計算誤差
         if(abs(f(kai2)).lt.deruta) then                                !f(kai2)の絶対値が計算誤差
                                                                        !より小さいとき無限ループを脱出する
           goto 32                                                      !無限ループの脱出32へ行く

         endif
      goto 18                                                           !18へ行く
! ----------------------無限ループ:ここまで-----------------------------
  32  continue                                                          !無限ループからの脱出
      
      write(*,*) i, '|', kai, '|',  f(kai), '|', kai2, '|',  f(kai2),&  !最後の書き出し
                 '|', deruta
      stop    
      end program newton
! ---------------------関数の設定-----------------------------------
      real function f(x)                                                !関数fkaiの設定

        real :: f                                                       !方程式f(kai) = x^5 - 7x^4 + 16x^3 - 8x^2 -16x +16 = 0
        real :: x                                                       !引数

        f = (x**5.0e0) - ((7.0e0)*(x**4.0e0)) + (16.0e0)*(x**3.0e0) -&
            ((8.0e0)*(x**2.0e0)) - (16.0e0)*x + 16.0e0

      return
      end function f 

      real function df(dx)                                              !fkaiのkaiに対する微分関数

        real :: df                                                      !f(kai)のkai微分
        real :: dx                                                      !dfの引数

        df = (5.0e0)*(dx**4.0e0) - ((28.0e0)*(dx**3.0e0)) +&
             (48.0e0)*(dx**2) - ((16.0e0)*dx) - 16.0e0

      return
      end function df
