Browse Source

frontend/com_measure2.c, bug fix for "meas AVG"

meas "AVG" did merely the average of the given values,
  without consideration of their spacing on the "scale" axis.

now use trapezoidal summing to calculate the AVG

note, there is "meas INTEG"
  which goes beyond trapezoidal summing
pre-master-46
Marcel Hendrix 11 years ago
committed by rlar
parent
commit
f9432cb3da
  1. 32
      src/frontend/com_measure2.c

32
src/frontend/com_measure2.c

@ -696,9 +696,10 @@ measure_minMaxAvg(
ANALYSIS_TYPE_T mFunctionType /* in: one of AT_AVG, AT_MIN, AT_MAX, AT_MIN_AT, AT_MAX_AT */ ANALYSIS_TYPE_T mFunctionType /* in: one of AT_AVG, AT_MIN, AT_MAX, AT_MIN_AT, AT_MAX_AT */
) )
{ {
int i, avgCnt;
int i;
struct dvec *d, *dScale; struct dvec *d, *dScale;
double value, svalue, mValue, mValueAt; double value, svalue, mValue, mValueAt;
double pvalue = 0.0, sprev = 0.0, Tsum = 0.0;
int first; int first;
bool ac_check = FALSE, sp_check = FALSE, dc_check = FALSE, tran_check = FALSE; bool ac_check = FALSE, sp_check = FALSE, dc_check = FALSE, tran_check = FALSE;
@ -707,7 +708,6 @@ measure_minMaxAvg(
meas->m_measured = NAN; meas->m_measured = NAN;
meas->m_measured_at = NAN; meas->m_measured_at = NAN;
first = 0; first = 0;
avgCnt = 0;
d = vec_get(meas->m_vec); d = vec_get(meas->m_vec);
if (d == NULL) { if (d == NULL) {
@ -778,10 +778,26 @@ measure_minMaxAvg(
} }
if (first == 0) { if (first == 0) {
mValue = value;
mValueAt = svalue;
first = 1; first = 1;
switch (mFunctionType) {
case AT_MIN:
case AT_MIN_AT:
case AT_MAX_AT:
case AT_MAX:
mValue = value;
mValueAt = svalue;
break;
case AT_AVG:
mValue = 0.0;
mValueAt = svalue;
Tsum = 0.0;
pvalue = value;
sprev = svalue;
break;
default:
fprintf(cp_err, "Error: improper min/max/avg call.\n");
}
} else { } else {
switch (mFunctionType) { switch (mFunctionType) {
case AT_MIN: case AT_MIN:
@ -801,8 +817,10 @@ measure_minMaxAvg(
break; break;
} }
case AT_AVG: { case AT_AVG: {
mValue = mValue + value;
avgCnt ++;
mValue += 0.5 * (value + pvalue) * (svalue - sprev);
Tsum += (svalue - sprev);
pvalue = value;
sprev = svalue;
break; break;
} }
default : default :
@ -815,7 +833,7 @@ measure_minMaxAvg(
switch (mFunctionType) switch (mFunctionType)
{ {
case AT_AVG: { case AT_AVG: {
meas->m_measured = (mValue / avgCnt);
meas->m_measured = mValue / (first ? Tsum : 1.0);
meas->m_measured_at = svalue; meas->m_measured_at = svalue;
break; break;
} }

Loading…
Cancel
Save