Java Bytecode Assembly, Interesting concepts in the art of Computer Science/Software Development, maybe from time to time other pesky corp. related development issues.

Sunday, January 17, 2010

Running Average calculation implementation in Java

Quick blog and store note:

Here is a code to calculate average series of length N without the problem of overflow that naive average calculation could face.




/**
* Copyright (c) 2010, Maxim Veksler 
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met: 
* 
* Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* 
* Redistributions in binary form must reproduce the above copyright notice, 
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution. Neither the name
* of the http://bytecoded.blogspot.com/ nor the names of its contributors
* may be used to endorse or promote products derived from this software 
* without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/

/**
* Calculate average of arbitrary length series of doubles, running average ensures 
* result won't overflow.
* 
* Algorithm: CELLCOUNT represents number of cells calculated so far. 
* For each : cell
*  avg =  ((CELLCOUNT-1) * avg) + ((1/CELLCOUNT) * avg)
* 
* @param series vararg list of parameters (array of doubles).
* @return Average calculated from supplied series.
*/
public static double movingAverage(double... series) {
if(series.length < 1) {
   return 0;
  } 

  double avg = series[0];
  for(int i = 1; i < series.length; i++) {
   avg = (avg * ((double)i/(i+1))) + (series[i] * ((double)1/(i+1)));
  }
  
  return avg;
 }

No comments:

Post a Comment

About Me

My photo
Tel Aviv, Israel
I work in one of Israel's Hi-Tech company's. I do 5 nines system development with some system administration. This blog will focus on the technical side of things, with some philosophical strings attached.