Statistical Summaries
Range Summary
Min, Max, Difference
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.
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
measurements ← [8, 3, 9, 7, 10]
10measurements = [8, 3, 9, 7, 10]11limit_count = 4values this step[8, 3, 9, 7, 10]measurementslimit_count ← 4
10measurements = [8, 3, 9, 7, 10]11limit_count = 412low = measurements(1)values this step4limit_countlow ← 8
11limit_count = 412low = measurements(1)13high = measurements(1)values this step8lowhigh ← 8
12low = measurements(1)13high = measurements(1)14do i = 2, limit_countvalues this step8highi ← 2
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step2ilow ← 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) < lowif (measurements(i) > high) high = measurements(i)
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step.false.measurements(2) > highi ← 3
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step3iif (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) < lowhigh ← 9
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step9high.true.measurements(3) > highi ← 4
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step4iif (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) < lowif (measurements(i) > high) high = measurements(i)
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step.false.measurements(4) > highspread ← 6
17end do18spread = high - low19print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spreadvalues this step6spread9high3lowprint '(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_demooutput4 3 9 6values this step4limit_count3low9high6spread
measurements ← [8, 3, 9, 7, 10]
10measurements = [8, 3, 9, 7, 10]11limit_count = 2values this step[8, 3, 9, 7, 10]measurementslimit_count ← 2
10measurements = [8, 3, 9, 7, 10]11limit_count = 212low = measurements(1)values this step2limit_countlow ← 8
11limit_count = 212low = measurements(1)13high = measurements(1)values this step8lowhigh ← 8
12low = measurements(1)13high = measurements(1)14do i = 2, limit_countvalues this step8highi ← 2
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step2ilow ← 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) < lowif (measurements(i) > high) high = measurements(i)
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step.false.measurements(2) > highspread ← 5
17end do18spread = high - low19print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spreadvalues this step5spread8high3lowprint '(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_demooutput2 3 8 5values this step2limit_count3low8high5spread
measurements ← [8, 3, 9, 7, 10]
10measurements = [8, 3, 9, 7, 10]11limit_count = 5values this step[8, 3, 9, 7, 10]measurementslimit_count ← 5
10measurements = [8, 3, 9, 7, 10]11limit_count = 512low = measurements(1)values this step5limit_countlow ← 8
11limit_count = 512low = measurements(1)13high = measurements(1)values this step8lowhigh ← 8
12low = measurements(1)13high = measurements(1)14do i = 2, limit_countvalues this step8highi ← 2
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step2ilow ← 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) < lowif (measurements(i) > high) high = measurements(i)
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step.false.measurements(2) > highi ← 3
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step3iif (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) < lowhigh ← 9
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step9high.true.measurements(3) > highi ← 4
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step4iif (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) < lowif (measurements(i) > high) high = measurements(i)
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step.false.measurements(4) > highi ← 5
13high = measurements(1)14do i = 2, limit_count15 if (measurements(i) < low) low = measurements(i)values this step5iif (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) < lowhigh ← 10
15 if (measurements(i) < low) low = measurements(i)16 if (measurements(i) > high) high = measurements(i)17end dovalues this step10high.true.measurements(5) > highspread ← 7
17end do18spread = high - low19print '(I0, 1X, I0, 1X, I0, 1X, I0)', limit_count, low, high, spreadvalues this step7spread10high3lowprint '(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_demooutput5 3 10 7values 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.