program newton_sqrt impplicit none real(8) :: x1, x2, a, er, er0=1.0d-6 !er0は許容誤差 integer :: k, km=100 !kmは最大反復回数 write(*,*) 'input a :', !入力を促す表示 read(*,*) a !入力されたデータを変数aに格納 if ( a<= 0.0d0) stop 'a<=0.0d0' !a>0の時計算実行 x1 = a !近似解の初期値をaとする do k = 1, km !最大km回ループを回す x2 = x1 - 0.5d0 * ((x1 * x1) - a) / x1 !新しい近似解x2の計算 er = abs(x2 - x1) !x1とx2の差を計算 if ( er < er0) exit !許容誤差以下ならば計算終了 x1 = x2 !x1にx2を入れ替える end do !doループ終了 write(*,*) 'kai, k, er = ',x2, k, er !近似解,反復回数,誤差の出力 end program newton_sqrt