mirror of
https://github.com/Microsoft/calculator.git
synced 2025-08-22 06:13:14 -07:00
Convert Rational::Add to + and += operator overrides.
This commit is contained in:
parent
08e973a0b6
commit
259d16e1b8
6 changed files with 22 additions and 18 deletions
|
@ -91,14 +91,14 @@ namespace CalcEngine
|
||||||
return Rational{ Number{ -1 * m_p.Sign(), m_p.Exp(), m_p.Mantissa() }, m_q };
|
return Rational{ Number{ -1 * m_p.Sign(), m_p.Exp(), m_p.Mantissa() }, m_q };
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational Rational::Add(Rational const& rhs, int32_t precision) const
|
Rational& Rational::operator+=(Rational const& rhs)
|
||||||
{
|
{
|
||||||
PRAT lhsRat = this->ToPRAT();
|
PRAT lhsRat = this->ToPRAT();
|
||||||
PRAT rhsRat = rhs.ToPRAT();
|
PRAT rhsRat = rhs.ToPRAT();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
addrat(&lhsRat, rhsRat, precision);
|
addrat(&lhsRat, rhsRat, RATIONAL_PRECISION);
|
||||||
destroyrat(rhsRat);
|
destroyrat(rhsRat);
|
||||||
}
|
}
|
||||||
catch (DWORD error)
|
catch (DWORD error)
|
||||||
|
@ -108,10 +108,16 @@ namespace CalcEngine
|
||||||
throw(error);
|
throw(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational result = Rational{ lhsRat };
|
*this = Rational{ lhsRat };
|
||||||
destroyrat(lhsRat);
|
destroyrat(lhsRat);
|
||||||
|
|
||||||
return result;
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rational operator+(Rational lhs, Rational const& rhs)
|
||||||
|
{
|
||||||
|
lhs += rhs;
|
||||||
|
return lhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational Rational::Sub(Rational const& rhs, int32_t precision) const
|
Rational Rational::Sub(Rational const& rhs, int32_t precision) const
|
||||||
|
|
|
@ -718,7 +718,7 @@ void CCalcEngine::ProcessCommandWorker(WPARAM wParam)
|
||||||
{
|
{
|
||||||
/* MPLUS adds m_currentVal to immediate memory and kills the "mem" */
|
/* MPLUS adds m_currentVal to immediate memory and kills the "mem" */
|
||||||
/* indicator if the result is zero. */
|
/* indicator if the result is zero. */
|
||||||
Rational result = m_memoryValue->Add(m_currentVal, m_precision);
|
Rational result = *m_memoryValue + m_currentVal;
|
||||||
m_memoryValue = make_unique<Rational>(TruncateNumForIntMath(result)); // Memory should follow the current int mode
|
m_memoryValue = make_unique<Rational>(TruncateNumForIntMath(result)); // Memory should follow the current int mode
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1053,8 +1053,7 @@ wstring CCalcEngine::GetStringForDisplay(Rational const& rat, uint32_t radix)
|
||||||
if ((radix == 10) && fMsb)
|
if ((radix == 10) && fMsb)
|
||||||
{
|
{
|
||||||
// If high bit is set, then get the decimal number in negative 2's compl form.
|
// If high bit is set, then get the decimal number in negative 2's compl form.
|
||||||
tempRat = tempRat.Not(m_chopNumbers[m_numwidth], m_precision);
|
tempRat = -(tempRat.Not(m_chopNumbers[m_numwidth], m_precision) + 1);
|
||||||
tempRat = -(tempRat.Add(1, m_precision));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result = tempRat.ToString(radix, m_nFE, m_precision);
|
result = tempRat.ToString(radix, m_nFE, m_precision);
|
||||||
|
|
|
@ -39,8 +39,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
|
||||||
case IDC_COM:
|
case IDC_COM:
|
||||||
if (m_radix == 10 && !m_fIntegerMode)
|
if (m_radix == 10 && !m_fIntegerMode)
|
||||||
{
|
{
|
||||||
result = RationalMath::Integer(rat, m_precision);
|
result = -(RationalMath::Integer(rat, m_precision) + 1);
|
||||||
result = -(result.Add(1, m_precision));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -200,10 +199,10 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
|
||||||
shftRat = Rational{ m_bInv ? 60 : 100 };
|
shftRat = Rational{ m_bInv ? 60 : 100 };
|
||||||
secondRat = secondRat.Div(shftRat, m_precision);
|
secondRat = secondRat.Div(shftRat, m_precision);
|
||||||
|
|
||||||
minuteRat = minuteRat.Add(secondRat, m_precision);
|
minuteRat += secondRat;
|
||||||
minuteRat = minuteRat.Div(shftRat, m_precision);
|
minuteRat = minuteRat.Div(shftRat, m_precision);
|
||||||
|
|
||||||
result = degreeRat.Add(minuteRat, m_precision);
|
result = degreeRat + minuteRat;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_ADD:
|
case IDC_ADD:
|
||||||
result = result.Add(rhs, m_precision);
|
result += rhs;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_SUB:
|
case IDC_SUB:
|
||||||
|
@ -90,8 +90,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
||||||
|
|
||||||
if (fMsb)
|
if (fMsb)
|
||||||
{
|
{
|
||||||
result = rhs.Not(m_chopNumbers[m_numwidth], m_precision);
|
result = rhs.Not(m_chopNumbers[m_numwidth], m_precision) + 1;
|
||||||
result = result.Add(1, m_precision);
|
|
||||||
|
|
||||||
iNumeratorSign = -1;
|
iNumeratorSign = -1;
|
||||||
}
|
}
|
||||||
|
@ -101,8 +100,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
||||||
|
|
||||||
if (fMsb)
|
if (fMsb)
|
||||||
{
|
{
|
||||||
temp = temp.Not(m_chopNumbers[m_numwidth], m_precision);
|
temp = temp.Not(m_chopNumbers[m_numwidth], m_precision) + 1;
|
||||||
temp = temp.Add(1, m_precision);
|
|
||||||
|
|
||||||
iDenominatorSign = -1;
|
iDenominatorSign = -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ void CCalcEngine::SetRadixTypeAndNumWidth(RADIX_TYPE radixtype, NUM_WIDTH numwid
|
||||||
// If high bit is set, then get the decimal number in -ve 2'scompl form.
|
// If high bit is set, then get the decimal number in -ve 2'scompl form.
|
||||||
auto tempResult = m_currentVal.Not(m_chopNumbers[m_numwidth], m_precision);
|
auto tempResult = m_currentVal.Not(m_chopNumbers[m_numwidth], m_precision);
|
||||||
|
|
||||||
m_currentVal = -(tempResult.Add(1, m_precision));
|
m_currentVal = -(tempResult + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,12 +30,14 @@ namespace CalcEngine
|
||||||
Number const& Q() const;
|
Number const& Q() const;
|
||||||
|
|
||||||
Rational operator-() const;
|
Rational operator-() const;
|
||||||
Rational Add(Rational const& rhs, int32_t precision) const;
|
Rational& operator+=(Rational const& rhs);
|
||||||
Rational Sub(Rational const& rhs, int32_t precision) const;
|
Rational Sub(Rational const& rhs, int32_t precision) const;
|
||||||
Rational Mul(Rational const& rhs, int32_t precision) const;
|
Rational Mul(Rational const& rhs, int32_t precision) const;
|
||||||
Rational Div(Rational const& rhs, int32_t precision) const;
|
Rational Div(Rational const& rhs, int32_t precision) const;
|
||||||
Rational Mod(Rational const& rhs) const;
|
Rational Mod(Rational const& rhs) const;
|
||||||
|
|
||||||
|
friend Rational operator+(Rational lhs, Rational const& rhs);
|
||||||
|
|
||||||
Rational Lsh(Rational const& r, int32_t precision) const;
|
Rational Lsh(Rational const& r, int32_t precision) const;
|
||||||
Rational Rsh(Rational const& r, int32_t precision) const;
|
Rational Rsh(Rational const& r, int32_t precision) const;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue