|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <math.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define NUM_ITERS 1000000
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int num_iters = NUM_ITERS;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* computes min, max, and mean for an array; returns std deviation */
|
|
Packit |
577717 |
double
|
|
Packit |
577717 |
do_stats( long long *array, long long *min, long long *max, double *average )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
double std, tmp;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
*min = *max = array[0];
|
|
Packit |
577717 |
*average = 0;
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
*average += ( double ) array[i];
|
|
Packit |
577717 |
if ( *min > array[i] )
|
|
Packit |
577717 |
*min = array[i];
|
|
Packit |
577717 |
if ( *max < array[i] )
|
|
Packit |
577717 |
*max = array[i];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
*average = *average / ( double ) num_iters;
|
|
Packit |
577717 |
std = 0;
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
tmp = ( double ) array[i] - ( *average );
|
|
Packit |
577717 |
std += tmp * tmp;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
std = sqrt( std / ( num_iters - 1 ) );
|
|
Packit |
577717 |
return ( std );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
void
|
|
Packit |
577717 |
do_std_dev( long long *a, int *s, double std, double ave )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j;
|
|
Packit |
577717 |
double dev[10];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < 10; i++ ) {
|
|
Packit |
577717 |
dev[i] = std * ( i + 1 );
|
|
Packit |
577717 |
s[i] = 0;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
for ( j = 0; j < 10; j++ ) {
|
|
Packit |
577717 |
if ( ( ( double ) a[i] - dev[j] ) > ave )
|
|
Packit |
577717 |
s[j]++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
void
|
|
Packit |
577717 |
do_dist( long long *a, long long min, long long max, int bins, int *d )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i, j;
|
|
Packit |
577717 |
int dmax = 0;
|
|
Packit |
577717 |
int range = ( int ) ( max - min + 1 ); /* avoid edge conditions */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* clear the distribution array */
|
|
Packit |
577717 |
for ( i = 0; i < bins; i++ ) {
|
|
Packit |
577717 |
d[i] = 0;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* scan the array to distribute cost per bin */
|
|
Packit |
577717 |
for ( i = 0; i < num_iters; i++ ) {
|
|
Packit |
577717 |
j = ( ( int ) ( a[i] - min ) * bins ) / range;
|
|
Packit |
577717 |
d[j]++;
|
|
Packit |
577717 |
if ( j && ( dmax < d[j] ) )
|
|
Packit |
577717 |
dmax = d[j];
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* scale each bin to a max of 100 */
|
|
Packit |
577717 |
for ( i = 1; i < bins; i++ ) {
|
|
Packit |
577717 |
d[i] = ( d[i] * 100 ) / dmax;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|