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.

centered_average.f90
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 = 
    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 = 
    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 = 
    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
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.