Set a default base of base64 for Rational class.

This commit is contained in:
Josh Koon 2019-02-20 16:28:04 -08:00
commit 999027da10
9 changed files with 52 additions and 46 deletions

View file

@ -302,9 +302,9 @@ wstring CalcInput::ToString(uint32_t radix, bool isIntegerMode)
return result; return result;
} }
Rational CalcInput::ToRational(int32_t precision) Rational CalcInput::ToRational(uint32_t radix, int32_t precision)
{ {
PRAT rat = StringToRat(m_base.IsNegative(), m_base.value, m_exponent.IsNegative(), m_exponent.value, BASEX, precision); PRAT rat = StringToRat(m_base.IsNegative(), m_base.value, m_exponent.IsNegative(), m_exponent.value, radix, precision);
if (rat == nullptr) if (rat == nullptr)
{ {
return 0; return 0;

View file

@ -213,7 +213,7 @@ namespace CalcEngine
try try
{ {
lshrat(&lhsRat, rhsRat, BASEX, precision); lshrat(&lhsRat, rhsRat, DEFAULT_BASE, precision);
destroyrat(rhsRat); destroyrat(rhsRat);
} }
catch (DWORD error) catch (DWORD error)
@ -236,7 +236,7 @@ namespace CalcEngine
try try
{ {
rshrat(&lhsRat, rhsRat, BASEX, precision); rshrat(&lhsRat, rhsRat, DEFAULT_BASE, precision);
destroyrat(rhsRat); destroyrat(rhsRat);
} }
catch (DWORD error) catch (DWORD error)
@ -264,7 +264,7 @@ namespace CalcEngine
try try
{ {
andrat(&lhsRat, rhsRat, BASEX, precision); andrat(&lhsRat, rhsRat, DEFAULT_BASE, precision);
destroyrat(rhsRat); destroyrat(rhsRat);
} }
catch (DWORD error) catch (DWORD error)
@ -286,7 +286,7 @@ namespace CalcEngine
PRAT rhsRat = rhs.ToPRAT(); PRAT rhsRat = rhs.ToPRAT();
try try
{ {
orrat(&lhsRat, rhsRat, BASEX, precision); orrat(&lhsRat, rhsRat, DEFAULT_BASE, precision);
destroyrat(rhsRat); destroyrat(rhsRat);
} }
catch (DWORD error) catch (DWORD error)
@ -308,7 +308,7 @@ namespace CalcEngine
PRAT rhsRat = rhs.ToPRAT(); PRAT rhsRat = rhs.ToPRAT();
try try
{ {
xorrat(&lhsRat, rhsRat, BASEX, precision); xorrat(&lhsRat, rhsRat, DEFAULT_BASE, precision);
destroyrat(rhsRat); destroyrat(rhsRat);
} }
catch (DWORD error) catch (DWORD error)
@ -447,7 +447,7 @@ namespace CalcEngine
uint64_t result; uint64_t result;
try try
{ {
result = rattoUlonglong(rat, BASEX, precision); result = rattoUlonglong(rat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {

View file

@ -139,7 +139,7 @@ void CCalcEngine::ProcessCommandWorker(WPARAM wParam)
(IDC_SIGN == wParam && 10 != m_radix)) (IDC_SIGN == wParam && 10 != m_radix))
{ {
m_bRecord = false; m_bRecord = false;
m_currentVal = m_input.ToRational(m_precision); m_currentVal = m_input.ToRational(m_radix, m_precision);
DisplayNum(); // Causes 3.000 to shrink to 3. on first op. DisplayNum(); // Causes 3.000 to shrink to 3. on first op.
} }
} }
@ -651,7 +651,7 @@ void CCalcEngine::ProcessCommandWorker(WPARAM wParam)
case IDM_BYTE: case IDM_BYTE:
if (m_bRecord) if (m_bRecord)
{ {
m_currentVal = m_input.ToRational(m_precision); m_currentVal = m_input.ToRational(m_radix, m_precision);
m_bRecord = false; m_bRecord = false;
} }
@ -1018,7 +1018,7 @@ int CCalcEngine::GetCurrentRadix()
wstring CCalcEngine::GetCurrentResultForRadix(uint32_t radix, int32_t precision) wstring CCalcEngine::GetCurrentResultForRadix(uint32_t radix, int32_t precision)
{ {
Rational rat = (m_bRecord ? m_input.ToRational(m_precision) : m_currentVal); Rational rat = (m_bRecord ? m_input.ToRational(m_radix, m_precision) : m_currentVal);
ChangeConstants(m_radix, precision); ChangeConstants(m_radix, precision);

View file

@ -13,7 +13,7 @@ Rational RationalMath::Frac(Rational const& rat, int32_t precision)
PRAT prat = rat.ToPRAT(); PRAT prat = rat.ToPRAT();
try try
{ {
fracrat(&prat, BASEX, precision); fracrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -32,7 +32,7 @@ Rational RationalMath::Integer(Rational const& rat, int32_t precision)
PRAT prat = rat.ToPRAT(); PRAT prat = rat.ToPRAT();
try try
{ {
intrat(&prat, BASEX, precision); intrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -53,7 +53,7 @@ Rational RationalMath::Pow(Rational const& base, Rational const& pow, int32_t pr
try try
{ {
powrat(&baseRat, powRat, BASEX, precision); powrat(&baseRat, powRat, DEFAULT_BASE, precision);
destroyrat(powRat); destroyrat(powRat);
} }
catch (DWORD error) catch (DWORD error)
@ -80,7 +80,7 @@ Rational RationalMath::Fact(Rational const& rat, int32_t precision)
try try
{ {
factrat(&prat, BASEX, precision); factrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -100,7 +100,7 @@ Rational RationalMath::Exp(Rational const& rat, int32_t precision)
try try
{ {
exprat(&prat, BASEX, precision); exprat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -155,7 +155,7 @@ Rational RationalMath::Sin(Rational const& rat, ANGLE_TYPE angletype, int32_t pr
try try
{ {
sinanglerat(&prat, angletype, BASEX, precision); sinanglerat(&prat, angletype, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -175,7 +175,7 @@ Rational RationalMath::Cos(Rational const& rat, ANGLE_TYPE angletype, int32_t pr
try try
{ {
cosanglerat(&prat, angletype, BASEX, precision); cosanglerat(&prat, angletype, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -195,7 +195,7 @@ Rational RationalMath::Tan(Rational const& rat, ANGLE_TYPE angletype, int32_t pr
try try
{ {
tananglerat(&prat, angletype, BASEX, precision); tananglerat(&prat, angletype, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -215,7 +215,7 @@ Rational RationalMath::ASin(Rational const& rat, ANGLE_TYPE angletype, int32_t p
try try
{ {
asinanglerat(&prat, angletype, BASEX, precision); asinanglerat(&prat, angletype, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -235,7 +235,7 @@ Rational RationalMath::ACos(Rational const& rat, ANGLE_TYPE angletype, int32_t p
try try
{ {
acosanglerat(&prat, angletype, BASEX, precision); acosanglerat(&prat, angletype, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -255,7 +255,7 @@ Rational RationalMath::ATan(Rational const& rat, ANGLE_TYPE angletype, int32_t p
try try
{ {
atananglerat(&prat, angletype, BASEX, precision); atananglerat(&prat, angletype, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -275,7 +275,7 @@ Rational RationalMath::Sinh(Rational const& rat, int32_t precision)
try try
{ {
sinhrat(&prat, BASEX, precision); sinhrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -295,7 +295,7 @@ Rational RationalMath::Cosh(Rational const& rat, int32_t precision)
try try
{ {
coshrat(&prat, BASEX, precision); coshrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -315,7 +315,7 @@ Rational RationalMath::Tanh(Rational const& rat, int32_t precision)
try try
{ {
tanhrat(&prat, BASEX, precision); tanhrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -335,7 +335,7 @@ Rational RationalMath::ASinh(Rational const& rat, int32_t precision)
try try
{ {
asinhrat(&prat, BASEX, precision); asinhrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {
@ -355,7 +355,7 @@ Rational RationalMath::ACosh(Rational const& rat, int32_t precision)
try try
{ {
acoshrat(&prat, BASEX, precision); acoshrat(&prat, DEFAULT_BASE, precision);
} }
catch (DWORD error) catch (DWORD error)
{ {

View file

@ -54,7 +54,7 @@ namespace CalcEngine
void Backspace(); void Backspace();
void SetDecimalSymbol(wchar_t decSymbol); void SetDecimalSymbol(wchar_t decSymbol);
std::wstring ToString(uint32_t radix, bool isIntegerMode); std::wstring ToString(uint32_t radix, bool isIntegerMode);
Rational ToRational(int32_t precision); Rational ToRational(uint32_t radix, int32_t precision);
private: private:
bool m_hasExponent; bool m_hasExponent;

View file

@ -6,6 +6,11 @@
namespace CalcEngine namespace CalcEngine
{ {
// Default Base/Radix to use for Rational calculations
// Defaults to base 64 rather than the RatPack-internal BASEX because many
// calculations do not support bases > 64.
static constexpr uint32_t DEFAULT_BASE = BASEX;
class Rational class Rational
{ {
public: public:

View file

@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved. // Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. // Licensed under the MIT License.
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -347,6 +347,7 @@ PNUMBER numtonRadixx(_In_ PNUMBER a, uint32_t radix)
// mantissa a string representation of a number // mantissa a string representation of a number
// exponentIsNegative true if exponent is less than zero // exponentIsNegative true if exponent is less than zero
// exponent a string representation of a number // exponent a string representation of a number
// radix is the number base used in the source string
// //
// RETURN: PRAT representation of string input. // RETURN: PRAT representation of string input.
// Or nullptr if no number scanned. // Or nullptr if no number scanned.

View file

@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved. // Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. // Licensed under the MIT License.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -75,15 +75,15 @@ void fracrat( PRAT *pa , uint32_t radix, int32_t precision)
{ {
// Only do the intrat operation if number is nonzero. // Only do the intrat operation if number is nonzero.
// and only if the bottom part is not one. // and only if the bottom part is not one.
if ( !zernum( (*pa)->pp ) && !equnum( (*pa)->pq, num_one ) ) //if ( !zernum( (*pa)->pp ) && !equnum( (*pa)->pq, num_one ) )
{ //{
wstring ratStr = RatToString(*pa, FMT_FLOAT, radix, precision); // wstring ratStr = RatToString(*pa, FMT_FLOAT, radix, precision);
PNUMBER pnum = StringToNumber(ratStr, radix, precision); // PNUMBER pnum = StringToNumber(ratStr, radix, precision);
//
destroyrat( *pa ); // destroyrat( *pa );
*pa = numtorat( pnum, radix); // *pa = numtorat( pnum, radix);
destroynum( pnum ); // destroynum( pnum );
} //}
remnum( &((*pa)->pp), (*pa)->pq, BASEX ); remnum( &((*pa)->pp), (*pa)->pq, BASEX );

View file

@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved. // Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. // Licensed under the MIT License.
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -291,12 +291,12 @@ void intrat( PRAT *px, uint32_t radix, int32_t precision)
// and only if the bottom part is not one. // and only if the bottom part is not one.
if ( !zernum( (*px)->pp ) && !equnum( (*px)->pq, num_one ) ) if ( !zernum( (*px)->pp ) && !equnum( (*px)->pq, num_one ) )
{ {
wstring ratStr = RatToString(*px, FMT_FLOAT, radix, precision); //wstring ratStr = RatToString(*px, FMT_FLOAT, radix, precision);
PNUMBER pnum = StringToNumber(ratStr, radix, precision); //PNUMBER pnum = StringToNumber(ratStr, radix, precision);
//
destroyrat( *px ); //destroyrat( *px );
*px = numtorat( pnum, radix); //*px = numtorat( pnum, radix);
destroynum( pnum ); //destroynum( pnum );
PRAT pret = nullptr; PRAT pret = nullptr;
DUPRAT(pret,*px); DUPRAT(pret,*px);