58 lines
		
	
	
	
		
			984 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
	
		
			984 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #include <math.h>
 | ||
|  | 
 | ||
|  | #include "stat.h"
 | ||
|  | 
 | ||
|  | void update_stats(struct stats *stats, u64 val) | ||
|  | { | ||
|  | 	double delta; | ||
|  | 
 | ||
|  | 	stats->n++; | ||
|  | 	delta = val - stats->mean; | ||
|  | 	stats->mean += delta / stats->n; | ||
|  | 	stats->M2 += delta*(val - stats->mean); | ||
|  | } | ||
|  | 
 | ||
|  | double avg_stats(struct stats *stats) | ||
|  | { | ||
|  | 	return stats->mean; | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
 | ||
|  |  * | ||
|  |  *       (\Sum n_i^2) - ((\Sum n_i)^2)/n | ||
|  |  * s^2 = ------------------------------- | ||
|  |  *                  n - 1 | ||
|  |  * | ||
|  |  * http://en.wikipedia.org/wiki/Stddev
 | ||
|  |  * | ||
|  |  * The std dev of the mean is related to the std dev by: | ||
|  |  * | ||
|  |  *             s | ||
|  |  * s_mean = ------- | ||
|  |  *          sqrt(n) | ||
|  |  * | ||
|  |  */ | ||
|  | double stddev_stats(struct stats *stats) | ||
|  | { | ||
|  | 	double variance, variance_mean; | ||
|  | 
 | ||
|  | 	if (!stats->n) | ||
|  | 		return 0.0; | ||
|  | 
 | ||
|  | 	variance = stats->M2 / (stats->n - 1); | ||
|  | 	variance_mean = variance / stats->n; | ||
|  | 
 | ||
|  | 	return sqrt(variance_mean); | ||
|  | } | ||
|  | 
 | ||
|  | double rel_stddev_stats(double stddev, double avg) | ||
|  | { | ||
|  | 	double pct = 0.0; | ||
|  | 
 | ||
|  | 	if (avg) | ||
|  | 		pct = 100.0 * stddev/avg; | ||
|  | 
 | ||
|  | 	return pct; | ||
|  | } |