Centering values before summing keeps intermediate totals small while preserving the final average.

Program

Play the program to choose a different center and recover the same average.

center
centered_average.f90
Replay: real traced execution (multi-file project)
program centered_average_demo
    implicit none
    real :: readings(3)
    real :: center
    real :: total_delta
    real :: average
    integer :: i

    readings = [1002.0, 998.0, 1005.0]
    center = 1000.0
    total_delta = 0.0
    do i = 1, 3
        total_delta = total_delta + (readings(i) - center)
    end do
    average = center + total_delta / 3.0
    print '(F0.1, 1X, F0.1)', center, average
end program centered_average_demo
program centered_average_demo
    implicit none
    real :: readings(3)
    real :: center
    real :: total_delta
    real :: average
    integer :: i

    readings = [1002.0, 998.0, 1005.0]
    center = 900.0
    total_delta = 0.0
    do i = 1, 3
        total_delta = total_delta + (readings(i) - center)
    end do
    average = center + total_delta / 3.0
    print '(F0.1, 1X, F0.1)', center, average
end program centered_average_demo
program centered_average_demo
    implicit none
    real :: readings(3)
    real :: center
    real :: total_delta
    real :: average
    integer :: i

    readings = [1002.0, 998.0, 1005.0]
    center = 1100.0
    total_delta = 0.0
    do i = 1, 3
        total_delta = total_delta + (readings(i) - center)
    end do
    average = center + total_delta / 3.0
    print '(F0.1, 1X, F0.1)', center, average
end program centered_average_demo
  1. readings ← [1002.0, 998.0, 1005.0]

    9readings = [1002.0, 998.0, 1005.0]10center = 1000.0
    values this step[1002.0, 998.0, 1005.0]readings
  2. center ← 1000.0

    9readings = [1002.0, 998.0, 1005.0]10center = 1000.011total_delta = 0.0
    values this step1000.0center
  3. total_delta ← 0.0

    10center = 1000.011total_delta = 0.012do i = 1, 3
    values this step0.0total_delta
  4. i ← 1

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step1i
  5. total_delta ← 2.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step2.0total_delta2.0readings(1) - center
  6. i ← 2

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step2i
  7. total_delta ← 0.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step0.0total_delta-2.0readings(2) - center
  8. i ← 3

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step3i
  9. total_delta ← 5.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step5.0total_delta5.0readings(3) - center
  10. average ← 1001.7

    14end do15average = center + total_delta / 3.016print '(F0.1, 1X, F0.1)', center, average
    values this step1001.7average1000.0center5.0total_delta
  11. print '(F0.1, 1X, F0.1)', center, average

    15    average = center + total_delta / 3.016    print '(F0.1, 1X, F0.1)', center, average17end program centered_average_demo
    output1000.0 1001.7
    values this step1000.0center1001.7average
  1. readings ← [1002.0, 998.0, 1005.0]

    9readings = [1002.0, 998.0, 1005.0]10center = 900.0
    values this step[1002.0, 998.0, 1005.0]readings
  2. center ← 900.0

    9readings = [1002.0, 998.0, 1005.0]10center = 900.011total_delta = 0.0
    values this step900.0center
  3. total_delta ← 0.0

    10center = 900.011total_delta = 0.012do i = 1, 3
    values this step0.0total_delta
  4. i ← 1

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step1i
  5. total_delta ← 102.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step102.0total_delta102.0readings(1) - center
  6. i ← 2

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step2i
  7. total_delta ← 200.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step200.0total_delta98.0readings(2) - center
  8. i ← 3

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step3i
  9. total_delta ← 305.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step305.0total_delta105.0readings(3) - center
  10. average ← 1001.7

    14end do15average = center + total_delta / 3.016print '(F0.1, 1X, F0.1)', center, average
    values this step1001.7average900.0center305.0total_delta
  11. print '(F0.1, 1X, F0.1)', center, average

    15    average = center + total_delta / 3.016    print '(F0.1, 1X, F0.1)', center, average17end program centered_average_demo
    output900.0 1001.7
    values this step900.0center1001.7average
  1. readings ← [1002.0, 998.0, 1005.0]

    9readings = [1002.0, 998.0, 1005.0]10center = 1100.0
    values this step[1002.0, 998.0, 1005.0]readings
  2. center ← 1100.0

    9readings = [1002.0, 998.0, 1005.0]10center = 1100.011total_delta = 0.0
    values this step1100.0center
  3. total_delta ← 0.0

    10center = 1100.011total_delta = 0.012do i = 1, 3
    values this step0.0total_delta
  4. i ← 1

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step1i
  5. total_delta ← -98.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step-98.0total_delta-98.0readings(1) - center
  6. i ← 2

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step2i
  7. total_delta ← -200.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step-200.0total_delta-102.0readings(2) - center
  8. i ← 3

    11total_delta = 0.012do i = 1, 313    total_delta = total_delta + (readings(i) - center)
    values this step3i
  9. total_delta ← -295.0

    12do i = 1, 313    total_delta = total_delta + (readings(i) - center)14end do
    values this step-295.0total_delta-95.0readings(3) - center
  10. average ← 1001.7

    14end do15average = center + total_delta / 3.016print '(F0.1, 1X, F0.1)', center, average
    values this step1001.7average1100.0center-295.0total_delta
  11. print '(F0.1, 1X, F0.1)', center, average

    15    average = center + total_delta / 3.016    print '(F0.1, 1X, F0.1)', center, average17end program centered_average_demo
    output1100.0 1001.7
    values this step1100.0center1001.7average
centering Each reading is converted to a delta from `center`.
small total `total_delta` accumulates smaller values than the original readings.
reconstruct The final average adds the center back after dividing the deltas.