C++程序  |  136行  |  4.47 KB

/* -*-C-*-
 ********************************************************************************
 *
 * File:        measure.h  (Formerly measure.h)
 * Description:  Statistics for a group of single measurements
 * Author:       Mark Seaman, SW Productivity
 * Created:      Fri Oct 16 14:37:00 1987
 * Modified:     Mon Apr  8 09:42:28 1991 (Mark Seaman) marks@hpgrlt
 * Language:     C
 * Package:      N/A
 * Status:       Reusable Software Component
 *
 * (c) Copyright 1987, Hewlett-Packard Company.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 *
 ********************************************************************************
 */

#ifndef MEASURE_H
#define MEASURE_H

/*
----------------------------------------------------------------------
              I n c l u d e s
----------------------------------------------------------------------
*/

#include <math.h>

/*
----------------------------------------------------------------------
              T y p e s
----------------------------------------------------------------------
*/

typedef struct
{
  long num_samples;
  float sum_of_samples;
  float sum_of_squares;
} MEASUREMENT;

/*
----------------------------------------------------------------------
              M a c r o s
----------------------------------------------------------------------
*/

/**********************************************************************
 * add_sample
 *
 * Add one more sample to a measurement.
 **********************************************************************/

#define ADD_SAMPLE(m,s)                           \
(m.sum_of_samples += (float) (s),               \
	m.sum_of_squares += (float) (s) * (float) (s), \
	++m.num_samples)

/**********************************************************************
 * mean
 *
 * Return the mean value of the measurement.
 **********************************************************************/

#define MEAN(m)                                       \
((m).num_samples ?                                  \
	((float) ((m).sum_of_samples / (m).num_samples)) : \
	0)

/**********************************************************************
 * new_measurement
 *
 * Initalize a record to hold a measurement of a group of individual
 * samples.
 **********************************************************************/

#define new_measurement(m)   \
((m).num_samples    = 0, \
	(m).sum_of_samples = 0, \
	(m).sum_of_squares = 0)

/**********************************************************************
 * number_of_samples
 *
 * Return the number of samples in a measurement.
 **********************************************************************/

#define number_of_samples(m)  \
((m).num_samples)

/**********************************************************************
 * standard_deviation
 *
 * Return the standard deviation of the measurement.
 **********************************************************************/

#define standard_deviation(m)                                \
((float) sqrt (VARIANCE (m)))

/**********************************************************************
 * variance
 *
 * Return the variance of the measurement.
 **********************************************************************/

#define VARIANCE(m)                                   \
(((m).num_samples > 1) ?                            \
	((float)                                           \
	(((m).num_samples * (m).sum_of_squares -          \
		(m).sum_of_samples * (m).sum_of_samples) /      \
	(((m).num_samples - 1) * (m).num_samples)))   :  \
	0)

/**********************************************************************
 * print_summary
 *
 * Summarize a MEASUREMENT record.
 **********************************************************************/

#define print_summary(string,measure)                       \
cprintf ("\t%-20s \tn = %d, \tm = %4.2f, \ts = %4.2f\n ",  \
			string,                                          \
			number_of_samples  (measure),                    \
			MEAN           (measure),                    \
			standard_deviation (measure))
#endif