2022-03-07 23:43:53 -05:00
|
|
|
|
---
|
|
|
|
|
# katex
|
|
|
|
|
title: running average
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
The running average $a_n$ of a series $R_n$
|
|
|
|
|
|
|
|
|
|
$$a_n =\frac{a\_{n-1}\times u+R_n\times v}{u+v}$$
|
|
|
|
|
|
|
|
|
|
The larger $u$ and the smaller $v$, the longer the period over which the running average is taken.
|
|
|
|
|
|
|
|
|
|
We don’t want to do floating point arithmetic, because different peers
|
|
|
|
|
might get different answers.
|
|
|
|
|
|
|
|
|
|
It is probably harmless if they get different answers, provided that this
|
|
|
|
|
happens rarely, but easier to ensure that this never happens than to try to
|
|
|
|
|
think about all the possible circumstances where this could become a
|
|
|
|
|
problem, where malicious people could contrive inputs to make sure it
|
|
|
|
|
becomes a problem.
|
|
|
|
|
|
|
|
|
|
Unsigned integer arithmetic is guaranteed to give the same answers on all
|
|
|
|
|
hardware under all compilers. So, when we can, use unsigned integers.
|
|
|
|
|
|
|
|
|
|
$R_n$is a very small integer where we are worried about very small
|
|
|
|
|
differences, so we rescale to represent arithmetic with eight or so bits after
|
|
|
|
|
the binary point in integer arithmetic.
|
|
|
|
|
|
|
|
|
|
$\widetilde {a_n}$represents the rescaled running average $a_n$
|
|
|
|
|
|
|
|
|
|
$$\widetilde {a_n}=\frac{u\widetilde{a_{n-1}} +v{R_n}\times 2^8}{u+v}$$
|
|
|
|
|
|
|
|
|
|
$$a_n = \bigg\lfloor\frac{{\widetilde {a_n}}+2^7}{2^8}\bigg\rfloor$$
|