> ... calculating the average (or arithmetic mean) of a stream's integers takes three registers and three operations per integer. One register counts the elements, another records their sum, and the third register holds the value of the average, calculated as the quotient of the sum and the count.
Here's an easy brain teaser: do the above using only two registers.
How about a special running average: keep the count in one register and the average in the other one. Let's say N is the current count and av the average. The algorithm is in C-style notation:
void addElement( int val ) {
++N;
av = ((N - 1) * av / N) + val / N;
}
I have used a similar trick (with a fixed N) to implement a cheap running average for an image acquisition software and it works quite well, but of course if N is very large val / N becomes negligible.
You could.. multiply the average register by the count register, then add the new integer to the average register, increment the count register and then re-divide?
Here's an easy brain teaser: do the above using only two registers.