mirror of
https://github.com/c3d/DB48X-on-DM42.git
synced 2024-09-28 03:20:53 +02:00
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:
parent
c6cb72c021
commit
a83a6057b7
1 changed files with 14 additions and 4 deletions
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue