Add a user-settable variable measureprec to set the number of digits

when printing the measure outputs.
Internally this is a global variable measure_precision.
Enable all measure commands to recognize measure_precision when
printing an output.
Default value is 5 (yielding 6 digits after .?).
This commit is contained in:
Holger Vogt 2026-02-07 13:21:54 +01:00
parent 5ec437f672
commit d163db99c7
4 changed files with 45 additions and 14 deletions

View File

@ -16,6 +16,8 @@
#include "com_measure2.h" #include "com_measure2.h"
#include "breakp2.h" #include "breakp2.h"
int measure_precision = -1;
typedef enum { typedef enum {
MEASUREMENT_OK = 0, MEASUREMENT_OK = 0,
MEASUREMENT_FAILURE = 1 MEASUREMENT_FAILURE = 1
@ -86,6 +88,9 @@ measure_get_precision(void)
if ((env_ptr = getenv("NGSPICE_MEAS_PRECISION")) != NULL) if ((env_ptr = getenv("NGSPICE_MEAS_PRECISION")) != NULL)
precision = atoi(env_ptr); precision = atoi(env_ptr);
if (measure_precision > 0)
precision = measure_precision;
return precision; return precision;
} }
@ -1810,9 +1815,13 @@ get_measure2(
// print results // print results
if (out_line) 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 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); *result = (measTarg->m_measured - measTrig->m_measured);
@ -1883,9 +1892,9 @@ err_ret1:
// print results // print results
if (out_line) 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 else
fprintf(mout,"%-20s= %e\n", mName, meas->m_measured); fprintf(mout,"%-20s= %.*e\n", mName, precision, meas->m_measured);
*result = meas->m_measured; *result = meas->m_measured;
@ -1924,7 +1933,7 @@ err_ret2:
if (out_line) if (out_line)
sprintf(out_line, "%-20s= %.*e\n", mName, precision, meas->m_measured); sprintf(out_line, "%-20s= %.*e\n", mName, precision, meas->m_measured);
else else
fprintf(mout, "%-20s= %e\n", mName, meas->m_measured); fprintf(mout, "%-20s= %.*e\n", mName, precision, meas->m_measured);
*result = meas->m_measured; *result = meas->m_measured;
@ -2012,9 +2021,11 @@ err_ret4:
// print results // print results
if (out_line) 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 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; *result = meas->m_measured;
@ -2059,17 +2070,21 @@ err_ret5:
if ((mFunctionType == AT_MIN) || (mFunctionType == AT_MAX)) { if ((mFunctionType == AT_MIN) || (mFunctionType == AT_MAX)) {
// print results // print results
if (out_line) 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 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; *result = measTrig->m_measured;
} else { } else {
// print results // print results
if (out_line) 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 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; *result = measTrig->m_measured_at;
} }
@ -2117,9 +2132,11 @@ err_ret6:
// print results // print results
if (out_line) 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 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); *result = (maxValue - minValue);

View File

@ -76,6 +76,7 @@ char *ft_setkwords[] = {
"lprplot5", "lprplot5",
"lprps", "lprps",
"maxwins", "maxwins",
"measureprec",
"modelcard", "modelcard",
"modelline", "modelline",
"moremode", "moremode",

View File

@ -342,6 +342,16 @@ cp_usrset(struct variable *var, bool isset)
raw_prec = var->va_num; raw_prec = var->va_num;
else else
fprintf(cp_err, "Bad 'rawfileprec' \"%s\"\n", var->va_name); 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")) { } else if (eq(var->va_name, "numdgt")) {
if ((var->va_type == CP_BOOL) && (isset == FALSE)) if ((var->va_type == CP_BOOL) && (isset == FALSE))
cp_numdgt = -1; cp_numdgt = -1;
@ -350,7 +360,7 @@ cp_usrset(struct variable *var, bool isset)
else if (var->va_type == CP_NUM) else if (var->va_type == CP_NUM)
cp_numdgt = var->va_num; cp_numdgt = var->va_num;
else else
fprintf(cp_err, "Excuse me??\n"); fprintf(cp_err, "Bad 'numdgt' \"%s\"\n", var->va_name);
} else if (eq(var->va_name, "unixcom")) { } else if (eq(var->va_name, "unixcom")) {
cp_dounixcom = isset; cp_dounixcom = isset;
if (isset) { if (isset) {

View File

@ -304,6 +304,9 @@ extern struct plot *raw_read(char *name);
extern bool do_measure(char *what, bool chk_only); extern bool do_measure(char *what, bool chk_only);
extern bool check_autostop(char *what); extern bool check_autostop(char *what);
/* com_measure2.c*/
extern int measure_precision;
/* resource.c */ /* resource.c */
extern void ft_ckspace(void); extern void ft_ckspace(void);