A range summary tracks the smallest and largest active values before subtracting them.

Program

Play the program to summarize a longer or shorter prefix of the measurements.

limit_count
range_summary.f90
Replay: real traced execution (multi-file project)
program range_summary_demo
    implicit none
    integer :: measurements(5)
    integer :: limit_count
    integer :: i
    integer :: low
    integer :: high
    integer :: spread

    measurements = [8, 3, 9, 7, 10]
    limit_count = 4
    low = measurements(1)
    high = measurements(1)
    do i = 2, limit_count
        if (measurements(i) < low) low = measurements(i)
        if (measurements(i) > high) high = measurements(i)
    end do
    spread = high - low
    print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread
end program range_summary_demo
program range_summary_demo
    implicit none
    integer :: measurements(5)
    integer :: limit_count
    integer :: i
    integer :: low
    integer :: high
    integer :: spread

    measurements = [8, 3, 9, 7, 10]
    limit_count = 2
    low = measurements(1)
    high = measurements(1)
    do i = 2, limit_count
        if (measurements(i) < low) low = measurements(i)
        if (measurements(i) > high) high = measurements(i)
    end do
    spread = high - low
    print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread
end program range_summary_demo
program range_summary_demo
    implicit none
    integer :: measurements(5)
    integer :: limit_count
    integer :: i
    integer :: low
    integer :: high
    integer :: spread

    measurements = [8, 3, 9, 7, 10]
    limit_count = 5
    low = measurements(1)
    high = measurements(1)
    do i = 2, limit_count
        if (measurements(i) < low) low = measurements(i)
        if (measurements(i) > high) high = measurements(i)
    end do
    spread = high - low
    print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread
end program range_summary_demo
  1. measurements ← [8, 3, 9, 7, 10]

    10measurements = [8, 3, 9, 7, 10]11limit_count = 4
    values this step[8, 3, 9, 7, 10]measurements
  2. limit_count ← 4

    10measurements = [8, 3, 9, 7, 10]11limit_count = 412low = measurements(1)
    values this step4limit_count
  3. low ← 8

    11limit_count = 412low = measurements(1)13high = measurements(1)
    values this step8low
  4. high ← 8

    12low = measurements(1)13high = measurements(1)14do i = 2, limit_count
    values this step8high
  5. i ← 2

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step2i
  6. low ← 3

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step3low.true.measurements(2) < low
  7. if (measurements(i) > high) high = measurements(i)

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step.false.measurements(2) > high
  8. i ← 3

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step3i
  9. if (measurements(i) < low) low = measurements(i)

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step.false.measurements(3) < low
  10. high ← 9

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step9high.true.measurements(3) > high
  11. i ← 4

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step4i
  12. if (measurements(i) < low) low = measurements(i)

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step.false.measurements(4) < low
  13. if (measurements(i) > high) high = measurements(i)

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step.false.measurements(4) > high
  14. spread ← 6

    17end do18spread = high - low19print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread
    values this step6spread9high3low
  15. print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread

    18    spread = high - low19    print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread20end program range_summary_demo
    output4 3 9 6
    values this step4limit_count3low9high6spread
  1. measurements ← [8, 3, 9, 7, 10]

    10measurements = [8, 3, 9, 7, 10]11limit_count = 2
    values this step[8, 3, 9, 7, 10]measurements
  2. limit_count ← 2

    10measurements = [8, 3, 9, 7, 10]11limit_count = 212low = measurements(1)
    values this step2limit_count
  3. low ← 8

    11limit_count = 212low = measurements(1)13high = measurements(1)
    values this step8low
  4. high ← 8

    12low = measurements(1)13high = measurements(1)14do i = 2, limit_count
    values this step8high
  5. i ← 2

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step2i
  6. low ← 3

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step3low.true.measurements(2) < low
  7. if (measurements(i) > high) high = measurements(i)

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step.false.measurements(2) > high
  8. spread ← 5

    17end do18spread = high - low19print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread
    values this step5spread8high3low
  9. print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread

    18    spread = high - low19    print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread20end program range_summary_demo
    output2 3 8 5
    values this step2limit_count3low8high5spread
  1. measurements ← [8, 3, 9, 7, 10]

    10measurements = [8, 3, 9, 7, 10]11limit_count = 5
    values this step[8, 3, 9, 7, 10]measurements
  2. limit_count ← 5

    10measurements = [8, 3, 9, 7, 10]11limit_count = 512low = measurements(1)
    values this step5limit_count
  3. low ← 8

    11limit_count = 512low = measurements(1)13high = measurements(1)
    values this step8low
  4. high ← 8

    12low = measurements(1)13high = measurements(1)14do i = 2, limit_count
    values this step8high
  5. i ← 2

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step2i
  6. low ← 3

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step3low.true.measurements(2) < low
  7. if (measurements(i) > high) high = measurements(i)

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step.false.measurements(2) > high
  8. i ← 3

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step3i
  9. if (measurements(i) < low) low = measurements(i)

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step.false.measurements(3) < low
  10. high ← 9

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step9high.true.measurements(3) > high
  11. i ← 4

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step4i
  12. if (measurements(i) < low) low = measurements(i)

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step.false.measurements(4) < low
  13. if (measurements(i) > high) high = measurements(i)

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step.false.measurements(4) > high
  14. i ← 5

    13high = measurements(1)14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)
    values this step5i
  15. if (measurements(i) < low) low = measurements(i)

    14do i = 2, limit_count15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)
    values this step.false.measurements(5) < low
  16. high ← 10

    15    if (measurements(i) < low) low = measurements(i)16    if (measurements(i) > high) high = measurements(i)17end do
    values this step10high.true.measurements(5) > high
  17. spread ← 7

    17end do18spread = high - low19print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread
    values this step7spread10high3low
  18. print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread

    18    spread = high - low19    print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spread20end program range_summary_demo
    output5 3 10 7
    values this step5limit_count3low10high7spread
initial extrema Both `low` and `high` start from the first active observation.
conditional update Each later value updates only the summary it beats.
spread The range width is `high - low` after the scan finishes.