unit: Set unit::mode while operating on units

When we multiply or divide unit objects, or raise a unit object to
some power, we don't want to evaluate variables in the unit.

For example, if we have `1_N*m 2_m *`, the result should not depend on
the value of variable `m`.

Fixes: #1095

Signed-off-by: Christophe de Dinechin <christophe@dinechin.org>
This commit is contained in:
Christophe de Dinechin 2024-08-01 02:31:23 +02:00
parent c6cb72c021
commit a83a6057b7

View file

@ -437,7 +437,10 @@ algebraic_p arithmetic::non_numeric<mul>(algebraic_r x, algebraic_r y)
algebraic_g yv = yu->value();
algebraic_g ye = yu->uexpr();
xv = xv * yv;
xe = xe * ye;
{
save<bool> umode(unit::mode, true);
xe = xe * ye;
}
return unit::simple(xv, xe);
}
else if (!y->is_symbolic() || xv->is_one())
@ -585,7 +588,10 @@ algebraic_p arithmetic::non_numeric<struct div>(algebraic_r x, algebraic_r y)
algebraic_g yv = yu->value();
algebraic_g ye = yu->uexpr();
xv = xv / yv;
xe = xe / ye;
{
save<bool> umode(unit::mode, true);
xe = xe / ye;
}
return unit::simple(xv, xe);
}
else if (!y->is_symbolic())
@ -881,8 +887,12 @@ algebraic_p arithmetic::non_numeric<struct pow>(algebraic_r x, algebraic_r y)
{
algebraic_g xv = xu->value();
algebraic_g xe = xu->uexpr();
save<bool> save(unit::mode, false);
return unit::simple(pow(xv, y), pow(xe, y));
xv = pow(xv, y);
{
save<bool> save(unit::mode, false);
xe = pow(xe, y);
}
return unit::simple(xv, xe);
}
// Check 0^0 (but check compatibility flag, since HPs return 1)