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;
							 | 
						||
| 
								 | 
							
								}
							 |