Numerical Stability
Centered Average
Summing Smaller Deltas
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.