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 "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);

View File

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

View File

@ -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) {

View File

@ -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);