diff --git a/src/frontend/com_measure2.c b/src/frontend/com_measure2.c index fd371edcd..29b6e63c9 100644 --- a/src/frontend/com_measure2.c +++ b/src/frontend/com_measure2.c @@ -16,6 +16,8 @@ #include "com_measure2.h" #include "breakp2.h" +int measure_precision = -1; + typedef enum { MEASUREMENT_OK = 0, MEASUREMENT_FAILURE = 1 @@ -86,6 +88,9 @@ measure_get_precision(void) if ((env_ptr = getenv("NGSPICE_MEAS_PRECISION")) != NULL) precision = atoi(env_ptr); + if (measure_precision > 0) + precision = measure_precision; + return precision; } @@ -1810,9 +1815,13 @@ get_measure2( // print results if (out_line) - sprintf(out_line, "%-20s= %e targ= %e trig= %e\n", mName, (measTarg->m_measured - measTrig->m_measured), measTarg->m_measured, measTrig->m_measured); + sprintf(out_line, "%-20s= %.*e targ= %.*e trig= %.*e\n", + mName, precision, (measTarg->m_measured - measTrig->m_measured), + precision, measTarg->m_measured, precision, measTrig->m_measured); else - fprintf(mout,"%-20s= %e targ= %e trig= %e\n", mName, (measTarg->m_measured - measTrig->m_measured), measTarg->m_measured, measTrig->m_measured); + fprintf(mout,"%-20s= %.*e targ= %.*e trig= %.*e\n", mName, precision, + (measTarg->m_measured - measTrig->m_measured), + precision, measTarg->m_measured, precision, measTrig->m_measured); *result = (measTarg->m_measured - measTrig->m_measured); @@ -1883,9 +1892,9 @@ err_ret1: // print results if (out_line) - sprintf(out_line, "%-20s= %e\n", mName, meas->m_measured); + sprintf(out_line, "%-20s= %.*e\n", mName, precision, meas->m_measured); else - fprintf(mout,"%-20s= %e\n", mName, meas->m_measured); + fprintf(mout,"%-20s= %.*e\n", mName, precision, meas->m_measured); *result = meas->m_measured; @@ -1924,7 +1933,7 @@ err_ret2: if (out_line) sprintf(out_line, "%-20s= %.*e\n", mName, precision, meas->m_measured); else - fprintf(mout, "%-20s= %e\n", mName, meas->m_measured); + fprintf(mout, "%-20s= %.*e\n", mName, precision, meas->m_measured); *result = meas->m_measured; @@ -2012,9 +2021,11 @@ err_ret4: // print results if (out_line) - sprintf(out_line, "%-20s= %e from= %e to= %e\n", mName, meas->m_measured, meas->m_at, meas->m_measured_at); + sprintf(out_line, "%-20s= %.*e from= %.*e to= %.*e\n", mName, + precision, meas->m_measured, precision, meas->m_at, precision, meas->m_measured_at); else - fprintf(mout, "%-20s= %e from= %e to= %e\n", mName, meas->m_measured, meas->m_at, meas->m_measured_at); + fprintf(mout, "%-20s= %.*e from= %.*e to= %.*e\n", mName, + precision, meas->m_measured, precision, meas->m_at, precision, meas->m_measured_at); *result = meas->m_measured; @@ -2059,17 +2070,21 @@ err_ret5: if ((mFunctionType == AT_MIN) || (mFunctionType == AT_MAX)) { // print results if (out_line) - sprintf(out_line, "%-20s= %e at= %e\n", mName, measTrig->m_measured, measTrig->m_measured_at); + sprintf(out_line, "%-20s= %.*e at= %.*e\n", + mName, precision, measTrig->m_measured, precision, measTrig->m_measured_at); else - fprintf(mout, "%-20s= %e at= %e\n", mName, measTrig->m_measured, measTrig->m_measured_at); + fprintf(mout, "%-20s= %.*e at= %.*e\n", + mName, precision, measTrig->m_measured, precision, measTrig->m_measured_at); *result = measTrig->m_measured; } else { // print results if (out_line) - sprintf(out_line, "%-20s= %e with= %e\n", mName, measTrig->m_measured_at, measTrig->m_measured); + sprintf(out_line, "%-20s= %.*e with= %.*e\n", + mName, precision, measTrig->m_measured_at, precision, measTrig->m_measured); else - fprintf(mout, "%-20s= %e with= %e\n", mName, measTrig->m_measured_at, measTrig->m_measured); + fprintf(mout, "%-20s= %.*e with= %.*e\n", + mName, precision, measTrig->m_measured_at, precision, measTrig->m_measured); *result = measTrig->m_measured_at; } @@ -2117,9 +2132,11 @@ err_ret6: // print results if (out_line) - sprintf(out_line, "%-20s= %e from= %e to= %e\n", mName, (maxValue - minValue), measTrig->m_from, measTrig->m_to); + sprintf(out_line, "%-20s= %.*e from= %.*e to= %.*e\n", + mName, precision, (maxValue - minValue), precision, measTrig->m_from, precision, measTrig->m_to); else - fprintf(mout, "%-20s= %e from= %e to= %e\n", mName, (maxValue - minValue), measTrig->m_from, measTrig->m_to); + fprintf(mout, "%-20s= %.*e from= %.*e to= %.*e\n", + mName, precision, (maxValue - minValue), precision, measTrig->m_from, precision, measTrig->m_to); *result = (maxValue - minValue); diff --git a/src/frontend/miscvars.c b/src/frontend/miscvars.c index 9632ef862..c157a9666 100644 --- a/src/frontend/miscvars.c +++ b/src/frontend/miscvars.c @@ -76,6 +76,7 @@ char *ft_setkwords[] = { "lprplot5", "lprps", "maxwins", + "measureprec", "modelcard", "modelline", "moremode", diff --git a/src/frontend/options.c b/src/frontend/options.c index 7dfe6f97a..d6da5a46c 100644 --- a/src/frontend/options.c +++ b/src/frontend/options.c @@ -342,6 +342,16 @@ cp_usrset(struct variable *var, bool isset) raw_prec = var->va_num; else fprintf(cp_err, "Bad 'rawfileprec' \"%s\"\n", var->va_name); + } + else if (eq(var->va_name, "measureprec")) { + if ((var->va_type == CP_BOOL) && (isset == FALSE)) + measure_precision = -1; + else if (var->va_type == CP_REAL) + measure_precision = (int)floor(var->va_real + 0.5); + else if (var->va_type == CP_NUM) + measure_precision = var->va_num; + else + fprintf(cp_err, "Bad 'measureprec' \"%s\"\n", var->va_name); } else if (eq(var->va_name, "numdgt")) { if ((var->va_type == CP_BOOL) && (isset == FALSE)) cp_numdgt = -1; @@ -350,7 +360,7 @@ cp_usrset(struct variable *var, bool isset) else if (var->va_type == CP_NUM) cp_numdgt = var->va_num; else - fprintf(cp_err, "Excuse me??\n"); + fprintf(cp_err, "Bad 'numdgt' \"%s\"\n", var->va_name); } else if (eq(var->va_name, "unixcom")) { cp_dounixcom = isset; if (isset) { diff --git a/src/include/ngspice/fteext.h b/src/include/ngspice/fteext.h index 69d428b51..af74009bd 100644 --- a/src/include/ngspice/fteext.h +++ b/src/include/ngspice/fteext.h @@ -304,6 +304,9 @@ extern struct plot *raw_read(char *name); extern bool do_measure(char *what, bool chk_only); extern bool check_autostop(char *what); +/* com_measure2.c*/ +extern int measure_precision; + /* resource.c */ extern void ft_ckspace(void);