Many numerical methods repeatedly reduce an error estimate. A small bounded loop can show the shape without doing heavy computation.

Program

Play the program to choose how many halving steps are applied.

step_count
convergence_steps.f90
Replay: real traced execution (multi-file project)
program convergence_steps_demo
    implicit none
    integer :: step_count
    integer :: i
    real :: error

    step_count = 3
    error = 1.0
    do i = 1, step_count
        error = error / 2.0
    end do
    print '(F0.3)', error
end program convergence_steps_demo
program convergence_steps_demo
    implicit none
    integer :: step_count
    integer :: i
    real :: error

    step_count = 1
    error = 1.0
    do i = 1, step_count
        error = error / 2.0
    end do
    print '(F0.3)', error
end program convergence_steps_demo
program convergence_steps_demo
    implicit none
    integer :: step_count
    integer :: i
    real :: error

    step_count = 5
    error = 1.0
    do i = 1, step_count
        error = error / 2.0
    end do
    print '(F0.3)', error
end program convergence_steps_demo
  1. step_count ← 3

    7step_count = 38error = 1.0
    values this step3step_count
  2. error ← 1.000

    7step_count = 38error = 1.09do i = 1, step_count
    values this step1.000error
  3. error ← 0.500

    9do i = 1, step_count10    error = error / 2.011end do
    values this step1.000 0.500error1i
  4. error ← 0.250

    9do i = 1, step_count10    error = error / 2.011end do
    values this step0.500 0.250error2i
  5. error ← 0.125

    9do i = 1, step_count10    error = error / 2.011end do
    values this step0.250 0.125error3i
  6. print '(F0.3)', error

    11    end do12    print '(F0.3)', error13end program convergence_steps_demo
    output0.125
    values this step0.125error
  1. step_count ← 1

    7step_count = 18error = 1.0
    values this step1step_count
  2. error ← 1.000

    7step_count = 18error = 1.09do i = 1, step_count
    values this step1.000error
  3. error ← 0.500

    9do i = 1, step_count10    error = error / 2.011end do
    values this step1.000 0.500error1i
  4. print '(F0.3)', error

    11    end do12    print '(F0.3)', error13end program convergence_steps_demo
    output0.500
    values this step0.500error
  1. step_count ← 5

    7step_count = 58error = 1.0
    values this step5step_count
  2. error ← 1.000

    7step_count = 58error = 1.09do i = 1, step_count
    values this step1.000error
  3. error ← 0.500

    9do i = 1, step_count10    error = error / 2.011end do
    values this step1.000 0.500error1i
  4. error ← 0.250

    9do i = 1, step_count10    error = error / 2.011end do
    values this step0.500 0.250error2i
  5. error ← 0.125

    9do i = 1, step_count10    error = error / 2.011end do
    values this step0.250 0.125error3i
  6. error ← 0.062

    9do i = 1, step_count10    error = error / 2.011end do
    values this step0.125 0.062error4i
  7. error ← 0.031

    9do i = 1, step_count10    error = error / 2.011end do
    values this step0.062 0.031error5i
  8. print '(F0.3)', error

    11    end do12    print '(F0.3)', error13end program convergence_steps_demo
    output0.031
    values this step0.031error
bounded loop `do i = 1, step_count` keeps the iteration count explicit.
error update Each loop halves the current error estimate.
convergence Repeated reduction shows the approach toward zero without relying on timing.