Fix some code analysis warnings in CalcManager (#1074)
This commit is contained in:
parent
cf735bbcf5
commit
f552428d97
@ -210,7 +210,7 @@ bool CHistoryCollector::FOpndAddedToHistory()
|
|||||||
// This is does the postfix to prefix translation of the input and adds the text to the history. Eg. doing 2 + 4 (sqrt),
|
// This is does the postfix to prefix translation of the input and adds the text to the history. Eg. doing 2 + 4 (sqrt),
|
||||||
// this routine will ensure the last sqrt call unary operator, actually goes back in history and wraps 4 in sqrt(4)
|
// this routine will ensure the last sqrt call unary operator, actually goes back in history and wraps 4 in sqrt(4)
|
||||||
//
|
//
|
||||||
void CHistoryCollector::AddUnaryOpToHistory(int nOpCode, bool fInv, ANGLE_TYPE angletype)
|
void CHistoryCollector::AddUnaryOpToHistory(int nOpCode, bool fInv, AngleType angletype)
|
||||||
{
|
{
|
||||||
int iCommandEnd;
|
int iCommandEnd;
|
||||||
// When successfully applying a unary op, there should be an opnd already
|
// When successfully applying a unary op, there should be an opnd already
|
||||||
@ -230,15 +230,15 @@ void CHistoryCollector::AddUnaryOpToHistory(int nOpCode, bool fInv, ANGLE_TYPE a
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
CalculationManager::Command angleOpCode;
|
CalculationManager::Command angleOpCode;
|
||||||
if (angletype == ANGLE_DEG)
|
if (angletype == AngleType::Degrees)
|
||||||
{
|
{
|
||||||
angleOpCode = CalculationManager::Command::CommandDEG;
|
angleOpCode = CalculationManager::Command::CommandDEG;
|
||||||
}
|
}
|
||||||
else if (angletype == ANGLE_RAD)
|
else if (angletype == AngleType::Radians)
|
||||||
{
|
{
|
||||||
angleOpCode = CalculationManager::Command::CommandRAD;
|
angleOpCode = CalculationManager::Command::CommandRAD;
|
||||||
}
|
}
|
||||||
else // (angletype == ANGLE_GRAD)
|
else // (angletype == AngleType::Gradians)
|
||||||
{
|
{
|
||||||
angleOpCode = CalculationManager::Command::CommandGRAD;
|
angleOpCode = CalculationManager::Command::CommandGRAD;
|
||||||
}
|
}
|
||||||
|
@ -460,7 +460,7 @@ namespace CalcEngine
|
|||||||
return !(lhs < rhs);
|
return !(lhs < rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring Rational::ToString(uint32_t radix, NUMOBJ_FMT fmt, int32_t precision) const
|
wstring Rational::ToString(uint32_t radix, NumberFormat fmt, int32_t precision) const
|
||||||
{
|
{
|
||||||
PRAT rat = this->ToPRAT();
|
PRAT rat = this->ToPRAT();
|
||||||
wstring result{};
|
wstring result{};
|
||||||
|
@ -147,7 +147,7 @@ Rational RationalMath::Abs(Rational const& rat)
|
|||||||
return Rational{ Number{ 1, rat.P().Exp(), rat.P().Mantissa() }, Number{ 1, rat.Q().Exp(), rat.Q().Mantissa() } };
|
return Rational{ Number{ 1, rat.P().Exp(), rat.P().Mantissa() }, Number{ 1, rat.Q().Exp(), rat.Q().Mantissa() } };
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational RationalMath::Sin(Rational const& rat, ANGLE_TYPE angletype)
|
Rational RationalMath::Sin(Rational const& rat, AngleType angletype)
|
||||||
{
|
{
|
||||||
PRAT prat = rat.ToPRAT();
|
PRAT prat = rat.ToPRAT();
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ Rational RationalMath::Sin(Rational const& rat, ANGLE_TYPE angletype)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational RationalMath::Cos(Rational const& rat, ANGLE_TYPE angletype)
|
Rational RationalMath::Cos(Rational const& rat, AngleType angletype)
|
||||||
{
|
{
|
||||||
PRAT prat = rat.ToPRAT();
|
PRAT prat = rat.ToPRAT();
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ Rational RationalMath::Cos(Rational const& rat, ANGLE_TYPE angletype)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational RationalMath::Tan(Rational const& rat, ANGLE_TYPE angletype)
|
Rational RationalMath::Tan(Rational const& rat, AngleType angletype)
|
||||||
{
|
{
|
||||||
PRAT prat = rat.ToPRAT();
|
PRAT prat = rat.ToPRAT();
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ Rational RationalMath::Tan(Rational const& rat, ANGLE_TYPE angletype)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational RationalMath::ASin(Rational const& rat, ANGLE_TYPE angletype)
|
Rational RationalMath::ASin(Rational const& rat, AngleType angletype)
|
||||||
{
|
{
|
||||||
PRAT prat = rat.ToPRAT();
|
PRAT prat = rat.ToPRAT();
|
||||||
|
|
||||||
@ -227,7 +227,7 @@ Rational RationalMath::ASin(Rational const& rat, ANGLE_TYPE angletype)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational RationalMath::ACos(Rational const& rat, ANGLE_TYPE angletype)
|
Rational RationalMath::ACos(Rational const& rat, AngleType angletype)
|
||||||
{
|
{
|
||||||
PRAT prat = rat.ToPRAT();
|
PRAT prat = rat.ToPRAT();
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ Rational RationalMath::ACos(Rational const& rat, ANGLE_TYPE angletype)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rational RationalMath::ATan(Rational const& rat, ANGLE_TYPE angletype)
|
Rational RationalMath::ATan(Rational const& rat, AngleType angletype)
|
||||||
{
|
{
|
||||||
PRAT prat = rat.ToPRAT();
|
PRAT prat = rat.ToPRAT();
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ CCalcEngine::CCalcEngine(
|
|||||||
, m_bRecord(false)
|
, m_bRecord(false)
|
||||||
, m_bSetCalcState(false)
|
, m_bSetCalcState(false)
|
||||||
, m_input(DEFAULT_DEC_SEPARATOR)
|
, m_input(DEFAULT_DEC_SEPARATOR)
|
||||||
, m_nFE(FMT_FLOAT)
|
, m_nFE(NumberFormat::Float)
|
||||||
, m_memoryValue{ make_unique<Rational>() }
|
, m_memoryValue{ make_unique<Rational>() }
|
||||||
, m_holdVal{}
|
, m_holdVal{}
|
||||||
, m_currentVal{}
|
, m_currentVal{}
|
||||||
@ -94,8 +94,8 @@ CCalcEngine::CCalcEngine(
|
|||||||
, m_nPrecOp()
|
, m_nPrecOp()
|
||||||
, m_precedenceOpCount(0)
|
, m_precedenceOpCount(0)
|
||||||
, m_nLastCom(0)
|
, m_nLastCom(0)
|
||||||
, m_angletype(ANGLE_DEG)
|
, m_angletype(AngleType::Degrees)
|
||||||
, m_numwidth(QWORD_WIDTH)
|
, m_numwidth(NUM_WIDTH::QWORD_WIDTH)
|
||||||
, m_HistoryCollector(pCalcDisplay, pHistoryDisplay, DEFAULT_DEC_SEPARATOR)
|
, m_HistoryCollector(pCalcDisplay, pHistoryDisplay, DEFAULT_DEC_SEPARATOR)
|
||||||
, m_groupSeparator(DEFAULT_GRP_SEPARATOR)
|
, m_groupSeparator(DEFAULT_GRP_SEPARATOR)
|
||||||
{
|
{
|
||||||
@ -105,7 +105,7 @@ CCalcEngine::CCalcEngine(
|
|||||||
|
|
||||||
m_maxTrigonometricNum = RationalMath::Pow(10, 100);
|
m_maxTrigonometricNum = RationalMath::Pow(10, 100);
|
||||||
|
|
||||||
SetRadixTypeAndNumWidth(DEC_RADIX, m_numwidth);
|
SetRadixTypeAndNumWidth(RadixType::Decimal, m_numwidth);
|
||||||
SettingsChanged();
|
SettingsChanged();
|
||||||
DisplayNum();
|
DisplayNum();
|
||||||
}
|
}
|
||||||
@ -128,10 +128,20 @@ void CCalcEngine::InitChopNumbers()
|
|||||||
auto maxVal = m_chopNumbers[i] / 2;
|
auto maxVal = m_chopNumbers[i] / 2;
|
||||||
maxVal = RationalMath::Integer(maxVal);
|
maxVal = RationalMath::Integer(maxVal);
|
||||||
|
|
||||||
m_maxDecimalValueStrings[i] = maxVal.ToString(10, FMT_FLOAT, m_precision);
|
m_maxDecimalValueStrings[i] = maxVal.ToString(10, NumberFormat::Float, m_precision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CalcEngine::Rational CCalcEngine::GetChopNumber() const
|
||||||
|
{
|
||||||
|
return m_chopNumbers[static_cast<int>(m_numwidth)];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring CCalcEngine::GetMaxDecimalValueString() const
|
||||||
|
{
|
||||||
|
return m_maxDecimalValueStrings[static_cast<int>(m_numwidth)];
|
||||||
|
}
|
||||||
|
|
||||||
// Gets the number in memory for UI to keep it persisted and set it again to a different instance
|
// Gets the number in memory for UI to keep it persisted and set it again to a different instance
|
||||||
// of CCalcEngine. Otherwise it will get destructed with the CalcEngine
|
// of CCalcEngine. Otherwise it will get destructed with the CalcEngine
|
||||||
unique_ptr<Rational> CCalcEngine::PersistedMemObject()
|
unique_ptr<Rational> CCalcEngine::PersistedMemObject()
|
||||||
|
@ -177,7 +177,7 @@ void CCalcEngine::ProcessCommandWorker(OpCode wParam)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_input.TryAddDigit(iValue, m_radix, m_fIntegerMode, m_maxDecimalValueStrings[m_numwidth], m_dwWordBitWidth, m_cIntDigitsSav))
|
if (!m_input.TryAddDigit(iValue, m_radix, m_fIntegerMode, GetMaxDecimalValueString(), m_dwWordBitWidth, m_cIntDigitsSav))
|
||||||
{
|
{
|
||||||
HandleErrorCommand(wParam);
|
HandleErrorCommand(wParam);
|
||||||
HandleMaxDigitsReached();
|
HandleMaxDigitsReached();
|
||||||
@ -619,7 +619,7 @@ void CCalcEngine::ProcessCommandWorker(OpCode wParam)
|
|||||||
case IDM_OCT:
|
case IDM_OCT:
|
||||||
case IDM_BIN:
|
case IDM_BIN:
|
||||||
{
|
{
|
||||||
SetRadixTypeAndNumWidth((RADIX_TYPE)(wParam - IDM_HEX), (NUM_WIDTH)-1);
|
SetRadixTypeAndNumWidth((RadixType)(wParam - IDM_HEX), (NUM_WIDTH)-1);
|
||||||
m_HistoryCollector.UpdateHistoryExpression(m_radix, m_precision);
|
m_HistoryCollector.UpdateHistoryExpression(m_radix, m_precision);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -635,20 +635,20 @@ void CCalcEngine::ProcessCommandWorker(OpCode wParam)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Compat. mode BaseX: Qword, Dword, Word, Byte
|
// Compat. mode BaseX: Qword, Dword, Word, Byte
|
||||||
SetRadixTypeAndNumWidth((RADIX_TYPE)-1, (NUM_WIDTH)(wParam - IDM_QWORD));
|
SetRadixTypeAndNumWidth((RadixType)-1, (NUM_WIDTH)(wParam - IDM_QWORD));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDM_DEG:
|
case IDM_DEG:
|
||||||
case IDM_RAD:
|
case IDM_RAD:
|
||||||
case IDM_GRAD:
|
case IDM_GRAD:
|
||||||
m_angletype = static_cast<ANGLE_TYPE>(wParam - IDM_DEG);
|
m_angletype = static_cast<AngleType>(wParam - IDM_DEG);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_SIGN:
|
case IDC_SIGN:
|
||||||
{
|
{
|
||||||
if (m_bRecord)
|
if (m_bRecord)
|
||||||
{
|
{
|
||||||
if (m_input.TryToggleSign(m_fIntegerMode, m_maxDecimalValueStrings[m_numwidth]))
|
if (m_input.TryToggleSign(m_fIntegerMode, GetMaxDecimalValueString()))
|
||||||
{
|
{
|
||||||
DisplayNum();
|
DisplayNum();
|
||||||
}
|
}
|
||||||
@ -766,7 +766,7 @@ void CCalcEngine::ProcessCommandWorker(OpCode wParam)
|
|||||||
break;
|
break;
|
||||||
case IDC_FE:
|
case IDC_FE:
|
||||||
// Toggle exponential notation display.
|
// Toggle exponential notation display.
|
||||||
m_nFE = NUMOBJ_FMT(!(int)m_nFE);
|
m_nFE = NumberFormat(!(int)m_nFE);
|
||||||
DisplayNum();
|
DisplayNum();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -961,7 +961,7 @@ static const std::unordered_map<int, FunctionNameElement> operatorStringTable =
|
|||||||
{ IDC_MOD, { SIDS_MOD, L"", L"", L"", L"", L"", SIDS_PROGRAMMER_MOD } },
|
{ IDC_MOD, { SIDS_MOD, L"", L"", L"", L"", L"", SIDS_PROGRAMMER_MOD } },
|
||||||
};
|
};
|
||||||
|
|
||||||
wstring_view CCalcEngine::OpCodeToUnaryString(int nOpCode, bool fInv, ANGLE_TYPE angletype)
|
wstring_view CCalcEngine::OpCodeToUnaryString(int nOpCode, bool fInv, AngleType angletype)
|
||||||
{
|
{
|
||||||
// Try to lookup the ID in the UFNE table
|
// Try to lookup the ID in the UFNE table
|
||||||
wstring ids = L"";
|
wstring ids = L"";
|
||||||
@ -969,7 +969,7 @@ wstring_view CCalcEngine::OpCodeToUnaryString(int nOpCode, bool fInv, ANGLE_TYPE
|
|||||||
if (auto pair = operatorStringTable.find(nOpCode); pair != operatorStringTable.end())
|
if (auto pair = operatorStringTable.find(nOpCode); pair != operatorStringTable.end())
|
||||||
{
|
{
|
||||||
const FunctionNameElement& element = pair->second;
|
const FunctionNameElement& element = pair->second;
|
||||||
if (!element.hasAngleStrings || ANGLE_DEG == angletype)
|
if (!element.hasAngleStrings || AngleType::Degrees == angletype)
|
||||||
{
|
{
|
||||||
if (fInv)
|
if (fInv)
|
||||||
{
|
{
|
||||||
@ -981,7 +981,7 @@ wstring_view CCalcEngine::OpCodeToUnaryString(int nOpCode, bool fInv, ANGLE_TYPE
|
|||||||
ids = element.degreeString;
|
ids = element.degreeString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ANGLE_RAD == angletype)
|
else if (AngleType::Radians == angletype)
|
||||||
{
|
{
|
||||||
if (fInv)
|
if (fInv)
|
||||||
{
|
{
|
||||||
@ -992,7 +992,7 @@ wstring_view CCalcEngine::OpCodeToUnaryString(int nOpCode, bool fInv, ANGLE_TYPE
|
|||||||
ids = element.radString;
|
ids = element.radString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ANGLE_GRAD == angletype)
|
else if (AngleType::Gradians == angletype)
|
||||||
{
|
{
|
||||||
if (fInv)
|
if (fInv)
|
||||||
{
|
{
|
||||||
@ -1094,7 +1094,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 complement form.
|
// If high bit is set, then get the decimal number in negative 2's complement form.
|
||||||
tempRat = -((tempRat ^ m_chopNumbers[m_numwidth]) + 1);
|
tempRat = -((tempRat ^ GetChopNumber()) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = tempRat.ToString(radix, m_nFE, m_precision);
|
result = tempRat.ToString(radix, m_nFE, m_precision);
|
||||||
|
@ -67,10 +67,10 @@ CalcEngine::Rational CCalcEngine::TruncateNumForIntMath(CalcEngine::Rational con
|
|||||||
{
|
{
|
||||||
// if negative make positive by doing a twos complement
|
// if negative make positive by doing a twos complement
|
||||||
result = -(result)-1;
|
result = -(result)-1;
|
||||||
result ^= m_chopNumbers[m_numwidth];
|
result ^= GetChopNumber();
|
||||||
}
|
}
|
||||||
|
|
||||||
result &= m_chopNumbers[m_numwidth];
|
result &= GetChopNumber();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = rat ^ m_chopNumbers[m_numwidth];
|
result = rat ^ GetChopNumber();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -29,11 +29,11 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_NAND:
|
case IDC_NAND:
|
||||||
result = (result & rhs) ^ m_chopNumbers[m_numwidth];
|
result = (result & rhs) ^ GetChopNumber();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_NOR:
|
case IDC_NOR:
|
||||||
result = (result | rhs) ^ m_chopNumbers[m_numwidth];
|
result = (result | rhs) ^ GetChopNumber();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDC_RSHF:
|
case IDC_RSHF:
|
||||||
@ -53,10 +53,10 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
|||||||
{
|
{
|
||||||
result = Integer(result);
|
result = Integer(result);
|
||||||
|
|
||||||
auto tempRat = m_chopNumbers[m_numwidth] >> holdVal;
|
auto tempRat = GetChopNumber() >> holdVal;
|
||||||
tempRat = Integer(tempRat);
|
tempRat = Integer(tempRat);
|
||||||
|
|
||||||
result |= tempRat ^ m_chopNumbers[m_numwidth];
|
result |= tempRat ^ GetChopNumber();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
|||||||
|
|
||||||
if (fMsb)
|
if (fMsb)
|
||||||
{
|
{
|
||||||
result = (rhs ^ m_chopNumbers[m_numwidth]) + 1;
|
result = (rhs ^ GetChopNumber()) + 1;
|
||||||
|
|
||||||
iNumeratorSign = -1;
|
iNumeratorSign = -1;
|
||||||
}
|
}
|
||||||
@ -115,7 +115,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa
|
|||||||
|
|
||||||
if (fMsb)
|
if (fMsb)
|
||||||
{
|
{
|
||||||
temp = (temp ^ m_chopNumbers[m_numwidth]) + 1;
|
temp = (temp ^ GetChopNumber()) + 1;
|
||||||
|
|
||||||
iDenominatorSign = -1;
|
iDenominatorSign = -1;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ using namespace std;
|
|||||||
|
|
||||||
// To be called when either the radix or num width changes. You can use -1 in either of these values to mean
|
// To be called when either the radix or num width changes. You can use -1 in either of these values to mean
|
||||||
// dont change that.
|
// dont change that.
|
||||||
void CCalcEngine::SetRadixTypeAndNumWidth(RADIX_TYPE radixtype, NUM_WIDTH numwidth)
|
void CCalcEngine::SetRadixTypeAndNumWidth(RadixType radixtype, NUM_WIDTH numwidth)
|
||||||
{
|
{
|
||||||
// When in integer mode, the number is represented in 2's complement form. When a bit width is changing, we can
|
// When in integer mode, the number is represented in 2's complement form. When a bit width is changing, we can
|
||||||
// change the number representation back to sign, abs num form in ratpak. Soon when display sees this, it will
|
// change the number representation back to sign, abs num form in ratpak. Soon when display sees this, it will
|
||||||
@ -24,19 +24,19 @@ void CCalcEngine::SetRadixTypeAndNumWidth(RADIX_TYPE radixtype, NUM_WIDTH numwid
|
|||||||
if (fMsb)
|
if (fMsb)
|
||||||
{
|
{
|
||||||
// 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 ^ m_chopNumbers[m_numwidth];
|
auto tempResult = m_currentVal ^ GetChopNumber();
|
||||||
|
|
||||||
m_currentVal = -(tempResult + 1);
|
m_currentVal = -(tempResult + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radixtype >= HEX_RADIX && radixtype <= BIN_RADIX)
|
if (radixtype >= RadixType::Hex && radixtype <= RadixType::Binary)
|
||||||
{
|
{
|
||||||
m_radix = NRadixFromRadixType(radixtype);
|
m_radix = NRadixFromRadixType(radixtype);
|
||||||
// radixtype is not even saved
|
// radixtype is not even saved
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numwidth >= QWORD_WIDTH && numwidth <= BYTE_WIDTH)
|
if (numwidth >= NUM_WIDTH::QWORD_WIDTH && numwidth <= NUM_WIDTH::BYTE_WIDTH)
|
||||||
{
|
{
|
||||||
m_numwidth = numwidth;
|
m_numwidth = numwidth;
|
||||||
m_dwWordBitWidth = DwWordBitWidthFromeNumWidth(numwidth);
|
m_dwWordBitWidth = DwWordBitWidthFromeNumWidth(numwidth);
|
||||||
@ -50,29 +50,36 @@ void CCalcEngine::SetRadixTypeAndNumWidth(RADIX_TYPE radixtype, NUM_WIDTH numwid
|
|||||||
DisplayNum();
|
DisplayNum();
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t CCalcEngine::DwWordBitWidthFromeNumWidth(NUM_WIDTH /*numwidth*/)
|
int32_t CCalcEngine::DwWordBitWidthFromeNumWidth(NUM_WIDTH numwidth)
|
||||||
{
|
{
|
||||||
static constexpr int nBitMax[] = { 64, 32, 16, 8 };
|
switch (numwidth)
|
||||||
int32_t wmax = nBitMax[0];
|
|
||||||
|
|
||||||
if (m_numwidth >= 0 && (size_t)m_numwidth < size(nBitMax))
|
|
||||||
{
|
{
|
||||||
wmax = nBitMax[m_numwidth];
|
case NUM_WIDTH::DWORD_WIDTH:
|
||||||
|
return 32;
|
||||||
|
case NUM_WIDTH::WORD_WIDTH:
|
||||||
|
return 16;
|
||||||
|
case NUM_WIDTH::BYTE_WIDTH:
|
||||||
|
return 8;
|
||||||
|
case NUM_WIDTH::QWORD_WIDTH:
|
||||||
|
default:
|
||||||
|
return 64;
|
||||||
}
|
}
|
||||||
return wmax;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t CCalcEngine::NRadixFromRadixType(RADIX_TYPE radixtype)
|
uint32_t CCalcEngine::NRadixFromRadixType(RadixType radixtype)
|
||||||
{
|
{
|
||||||
static constexpr uint32_t rgnRadish[4] = { 16, 10, 8, 2 }; /* Number bases in the same order as radixtype */
|
switch (radixtype)
|
||||||
uint32_t radix = 10;
|
|
||||||
|
|
||||||
// convert special bases into symbolic values
|
|
||||||
if (radixtype >= 0 && (size_t)radixtype < size(rgnRadish))
|
|
||||||
{
|
{
|
||||||
radix = rgnRadish[radixtype];
|
case RadixType::Hex:
|
||||||
|
return 16;
|
||||||
|
case RadixType::Octal:
|
||||||
|
return 8;
|
||||||
|
case RadixType::Binary:
|
||||||
|
return 2;
|
||||||
|
case RadixType::Decimal:
|
||||||
|
default:
|
||||||
|
return 10;
|
||||||
}
|
}
|
||||||
return radix;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggles a given bit into the number representation. returns true if it changed it actually.
|
// Toggles a given bit into the number representation. returns true if it changed it actually.
|
||||||
@ -141,7 +148,7 @@ void CCalcEngine::UpdateMaxIntDigits()
|
|||||||
// if in integer mode you still have to honor the max digits you can enter based on bit width
|
// if in integer mode you still have to honor the max digits you can enter based on bit width
|
||||||
if (m_fIntegerMode)
|
if (m_fIntegerMode)
|
||||||
{
|
{
|
||||||
m_cIntDigitsSav = static_cast<int>(m_maxDecimalValueStrings[m_numwidth].length()) - 1;
|
m_cIntDigitsSav = static_cast<int>(GetMaxDecimalValueString().length()) - 1;
|
||||||
// This is the max digits you can enter a decimal in fixed width mode aka integer mode -1. The last digit
|
// This is the max digits you can enter a decimal in fixed width mode aka integer mode -1. The last digit
|
||||||
// has to be checked separately
|
// has to be checked separately
|
||||||
}
|
}
|
||||||
|
@ -7,12 +7,6 @@
|
|||||||
|
|
||||||
namespace CalculationManager
|
namespace CalculationManager
|
||||||
{
|
{
|
||||||
enum CALCULATOR_MODE
|
|
||||||
{
|
|
||||||
CM_STD = 0,
|
|
||||||
CM_SCI,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct HISTORYITEMVECTOR
|
struct HISTORYITEMVECTOR
|
||||||
{
|
{
|
||||||
std::shared_ptr<std::vector<std::pair<std::wstring, int>>> spTokens;
|
std::shared_ptr<std::vector<std::pair<std::wstring, int>>> spTokens;
|
||||||
|
@ -33,6 +33,7 @@ namespace CalculationManager
|
|||||||
, m_savedDegreeMode(Command::CommandDEG)
|
, m_savedDegreeMode(Command::CommandDEG)
|
||||||
, m_pStdHistory(new CalculatorHistory(MAX_HISTORY_ITEMS))
|
, m_pStdHistory(new CalculatorHistory(MAX_HISTORY_ITEMS))
|
||||||
, m_pSciHistory(new CalculatorHistory(MAX_HISTORY_ITEMS))
|
, m_pSciHistory(new CalculatorHistory(MAX_HISTORY_ITEMS))
|
||||||
|
, m_pHistory(nullptr)
|
||||||
{
|
{
|
||||||
CCalcEngine::InitialOneTimeOnlySetup(*m_resourceProvider);
|
CCalcEngine::InitialOneTimeOnlySetup(*m_resourceProvider);
|
||||||
}
|
}
|
||||||
@ -551,9 +552,9 @@ namespace CalculationManager
|
|||||||
return m_pHistory->GetHistory();
|
return m_pHistory->GetHistory();
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<shared_ptr<HISTORYITEM>> const& CalculatorManager::GetHistoryItems(_In_ CALCULATOR_MODE mode)
|
vector<shared_ptr<HISTORYITEM>> const& CalculatorManager::GetHistoryItems(_In_ CalculatorMode mode)
|
||||||
{
|
{
|
||||||
return (mode == CM_STD) ? m_pStdHistory->GetHistory() : m_pSciHistory->GetHistory();
|
return (mode == CalculatorMode::Standard) ? m_pStdHistory->GetHistory() : m_pSciHistory->GetHistory();
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<HISTORYITEM> const& CalculatorManager::GetHistoryItem(_In_ unsigned int uIdx)
|
shared_ptr<HISTORYITEM> const& CalculatorManager::GetHistoryItem(_In_ unsigned int uIdx)
|
||||||
@ -576,20 +577,20 @@ namespace CalculationManager
|
|||||||
m_pHistory->ClearHistory();
|
m_pHistory->ClearHistory();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CalculatorManager::SetRadix(RADIX_TYPE iRadixType)
|
void CalculatorManager::SetRadix(RadixType iRadixType)
|
||||||
{
|
{
|
||||||
switch (iRadixType)
|
switch (iRadixType)
|
||||||
{
|
{
|
||||||
case RADIX_TYPE::HEX_RADIX:
|
case RadixType::Hex:
|
||||||
m_currentCalculatorEngine->ProcessCommand(IDC_HEX);
|
m_currentCalculatorEngine->ProcessCommand(IDC_HEX);
|
||||||
break;
|
break;
|
||||||
case RADIX_TYPE::DEC_RADIX:
|
case RadixType::Decimal:
|
||||||
m_currentCalculatorEngine->ProcessCommand(IDC_DEC);
|
m_currentCalculatorEngine->ProcessCommand(IDC_DEC);
|
||||||
break;
|
break;
|
||||||
case RADIX_TYPE::OCT_RADIX:
|
case RadixType::Octal:
|
||||||
m_currentCalculatorEngine->ProcessCommand(IDC_OCT);
|
m_currentCalculatorEngine->ProcessCommand(IDC_OCT);
|
||||||
break;
|
break;
|
||||||
case RADIX_TYPE::BIN_RADIX:
|
case RadixType::Binary:
|
||||||
m_currentCalculatorEngine->ProcessCommand(IDC_BIN);
|
m_currentCalculatorEngine->ProcessCommand(IDC_BIN);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -623,16 +624,16 @@ namespace CalculationManager
|
|||||||
return m_currentDegreeMode;
|
return m_currentDegreeMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CalculatorManager::SetHistory(_In_ CALCULATOR_MODE eMode, _In_ vector<shared_ptr<HISTORYITEM>> const& history)
|
void CalculatorManager::SetHistory(_In_ CalculatorMode eMode, _In_ vector<shared_ptr<HISTORYITEM>> const& history)
|
||||||
{
|
{
|
||||||
CalculatorHistory* pHistory = nullptr;
|
CalculatorHistory* pHistory = nullptr;
|
||||||
|
|
||||||
switch (eMode)
|
switch (eMode)
|
||||||
{
|
{
|
||||||
case CM_STD:
|
case CalculatorMode::Standard:
|
||||||
pHistory = m_pStdHistory.get();
|
pHistory = m_pStdHistory.get();
|
||||||
break;
|
break;
|
||||||
case CM_SCI:
|
case CalculatorMode::Scientific:
|
||||||
pHistory = m_pSciHistory.get();
|
pHistory = m_pSciHistory.get();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,8 @@ namespace CalculationManager
|
|||||||
|
|
||||||
enum class CalculatorMode
|
enum class CalculatorMode
|
||||||
{
|
{
|
||||||
StandardMode,
|
Standard = 0,
|
||||||
ScientificMode,
|
Scientific,
|
||||||
ProgrammerMode,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class CalculatorPrecision
|
enum class CalculatorPrecision
|
||||||
@ -117,7 +116,7 @@ namespace CalculationManager
|
|||||||
{
|
{
|
||||||
return m_savedCommands;
|
return m_savedCommands;
|
||||||
}
|
}
|
||||||
void SetRadix(RADIX_TYPE iRadixType);
|
void SetRadix(RadixType iRadixType);
|
||||||
void SetMemorizedNumbersString();
|
void SetMemorizedNumbersString();
|
||||||
std::wstring GetResultForRadix(uint32_t radix, int32_t precision, bool groupDigitsPerRadix);
|
std::wstring GetResultForRadix(uint32_t radix, int32_t precision, bool groupDigitsPerRadix);
|
||||||
void SetPrecision(int32_t precision);
|
void SetPrecision(int32_t precision);
|
||||||
@ -125,7 +124,7 @@ namespace CalculationManager
|
|||||||
wchar_t DecimalSeparator();
|
wchar_t DecimalSeparator();
|
||||||
|
|
||||||
std::vector<std::shared_ptr<HISTORYITEM>> const& GetHistoryItems();
|
std::vector<std::shared_ptr<HISTORYITEM>> const& GetHistoryItems();
|
||||||
std::vector<std::shared_ptr<HISTORYITEM>> const& GetHistoryItems(_In_ CalculationManager::CALCULATOR_MODE mode);
|
std::vector<std::shared_ptr<HISTORYITEM>> const& GetHistoryItems(_In_ CalculatorMode mode);
|
||||||
std::shared_ptr<HISTORYITEM> const& GetHistoryItem(_In_ unsigned int uIdx);
|
std::shared_ptr<HISTORYITEM> const& GetHistoryItem(_In_ unsigned int uIdx);
|
||||||
bool RemoveHistoryItem(_In_ unsigned int uIdx);
|
bool RemoveHistoryItem(_In_ unsigned int uIdx);
|
||||||
void ClearHistory();
|
void ClearHistory();
|
||||||
@ -134,7 +133,7 @@ namespace CalculationManager
|
|||||||
return m_pHistory->MaxHistorySize();
|
return m_pHistory->MaxHistorySize();
|
||||||
}
|
}
|
||||||
CalculationManager::Command GetCurrentDegreeMode();
|
CalculationManager::Command GetCurrentDegreeMode();
|
||||||
void SetHistory(_In_ CALCULATOR_MODE eMode, _In_ std::vector<std::shared_ptr<HISTORYITEM>> const& history);
|
void SetHistory(_In_ CalculatorMode eMode, _In_ std::vector<std::shared_ptr<HISTORYITEM>> const& history);
|
||||||
void SetInHistoryItemLoadMode(_In_ bool isHistoryItemLoadMode);
|
void SetInHistoryItemLoadMode(_In_ bool isHistoryItemLoadMode);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -277,7 +277,7 @@ wstring COpndCommand::GetString(uint32_t radix, int32_t precision)
|
|||||||
{
|
{
|
||||||
if (m_fInitialized)
|
if (m_fInitialized)
|
||||||
{
|
{
|
||||||
return m_value.ToString(radix, eNUMOBJ_FMT::FMT_FLOAT, precision);
|
return m_value.ToString(radix, NumberFormat::Float, precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
return wstring{};
|
return wstring{};
|
||||||
|
@ -31,14 +31,13 @@
|
|||||||
// The real exports follows later
|
// The real exports follows later
|
||||||
|
|
||||||
// This is expected to be in same order as IDM_QWORD, IDM_DWORD etc.
|
// This is expected to be in same order as IDM_QWORD, IDM_DWORD etc.
|
||||||
enum eNUM_WIDTH
|
enum class NUM_WIDTH
|
||||||
{
|
{
|
||||||
QWORD_WIDTH, // Number width of 64 bits mode (default)
|
QWORD_WIDTH, // Number width of 64 bits mode (default)
|
||||||
DWORD_WIDTH, // Number width of 32 bits mode
|
DWORD_WIDTH, // Number width of 32 bits mode
|
||||||
WORD_WIDTH, // Number width of 16 bits mode
|
WORD_WIDTH, // Number width of 16 bits mode
|
||||||
BYTE_WIDTH // Number width of 16 bits mode
|
BYTE_WIDTH // Number width of 16 bits mode
|
||||||
};
|
};
|
||||||
typedef enum eNUM_WIDTH NUM_WIDTH;
|
|
||||||
static constexpr size_t NUM_WIDTH_LENGTH = 4;
|
static constexpr size_t NUM_WIDTH_LENGTH = 4;
|
||||||
|
|
||||||
namespace CalculationManager
|
namespace CalculationManager
|
||||||
@ -106,7 +105,7 @@ public:
|
|||||||
{
|
{
|
||||||
return GetString(IdStrFromCmdId(nOpCode));
|
return GetString(IdStrFromCmdId(nOpCode));
|
||||||
}
|
}
|
||||||
static std::wstring_view OpCodeToUnaryString(int nOpCode, bool fInv, ANGLE_TYPE angletype);
|
static std::wstring_view OpCodeToUnaryString(int nOpCode, bool fInv, AngleType angletype);
|
||||||
static std::wstring_view OpCodeToBinaryString(int nOpCode, bool isIntegerMode);
|
static std::wstring_view OpCodeToBinaryString(int nOpCode, bool isIntegerMode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -117,11 +116,11 @@ private:
|
|||||||
int m_nOpCode; /* ID value of operation. */
|
int m_nOpCode; /* ID value of operation. */
|
||||||
int m_nPrevOpCode; // opcode which computed the number in m_currentVal. 0 if it is already bracketed or plain number or
|
int m_nPrevOpCode; // opcode which computed the number in m_currentVal. 0 if it is already bracketed or plain number or
|
||||||
// if it hasn't yet been computed
|
// if it hasn't yet been computed
|
||||||
bool m_bChangeOp; /* Flag for changing operation. */
|
bool m_bChangeOp; // Flag for changing operation
|
||||||
bool m_bRecord; // Global mode: recording or displaying
|
bool m_bRecord; // Global mode: recording or displaying
|
||||||
bool m_bSetCalcState; // Flag for setting the engine result state
|
bool m_bSetCalcState; // Flag for setting the engine result state
|
||||||
CalcEngine::CalcInput m_input; // Global calc input object for decimal strings
|
CalcEngine::CalcInput m_input; // Global calc input object for decimal strings
|
||||||
eNUMOBJ_FMT m_nFE; /* Scientific notation conversion flag. */
|
NumberFormat m_nFE; // Scientific notation conversion flag
|
||||||
CalcEngine::Rational m_maxTrigonometricNum;
|
CalcEngine::Rational m_maxTrigonometricNum;
|
||||||
std::unique_ptr<CalcEngine::Rational> m_memoryValue; // Current memory value.
|
std::unique_ptr<CalcEngine::Rational> m_memoryValue; // Current memory value.
|
||||||
|
|
||||||
@ -148,7 +147,7 @@ private:
|
|||||||
std::array<int, MAXPRECDEPTH> m_nPrecOp; /* Holding array for precedence operations. */
|
std::array<int, MAXPRECDEPTH> m_nPrecOp; /* Holding array for precedence operations. */
|
||||||
size_t m_precedenceOpCount; /* Current number of precedence ops in holding. */
|
size_t m_precedenceOpCount; /* Current number of precedence ops in holding. */
|
||||||
int m_nLastCom; // Last command entered.
|
int m_nLastCom; // Last command entered.
|
||||||
ANGLE_TYPE m_angletype; // Current Angle type when in dec mode. one of deg, rad or grad
|
AngleType m_angletype; // Current Angle type when in dec mode. one of deg, rad or grad
|
||||||
NUM_WIDTH m_numwidth; // one of qword, dword, word or byte mode.
|
NUM_WIDTH m_numwidth; // one of qword, dword, word or byte mode.
|
||||||
int32_t m_dwWordBitWidth; // # of bits in currently selected word size
|
int32_t m_dwWordBitWidth; // # of bits in currently selected word size
|
||||||
|
|
||||||
@ -179,15 +178,17 @@ private:
|
|||||||
CalcEngine::Rational TruncateNumForIntMath(CalcEngine::Rational const& rat);
|
CalcEngine::Rational TruncateNumForIntMath(CalcEngine::Rational const& rat);
|
||||||
CalcEngine::Rational SciCalcFunctions(CalcEngine::Rational const& rat, uint32_t op);
|
CalcEngine::Rational SciCalcFunctions(CalcEngine::Rational const& rat, uint32_t op);
|
||||||
CalcEngine::Rational DoOperation(int operation, CalcEngine::Rational const& lhs, CalcEngine::Rational const& rhs);
|
CalcEngine::Rational DoOperation(int operation, CalcEngine::Rational const& lhs, CalcEngine::Rational const& rhs);
|
||||||
void SetRadixTypeAndNumWidth(RADIX_TYPE radixtype, NUM_WIDTH numwidth);
|
void SetRadixTypeAndNumWidth(RadixType radixtype, NUM_WIDTH numwidth);
|
||||||
int32_t DwWordBitWidthFromeNumWidth(NUM_WIDTH numwidth);
|
int32_t DwWordBitWidthFromeNumWidth(NUM_WIDTH numwidth);
|
||||||
uint32_t NRadixFromRadixType(RADIX_TYPE radixtype);
|
uint32_t NRadixFromRadixType(RadixType radixtype);
|
||||||
double GenerateRandomNumber();
|
double GenerateRandomNumber();
|
||||||
|
|
||||||
bool TryToggleBit(CalcEngine::Rational& rat, uint32_t wbitno);
|
bool TryToggleBit(CalcEngine::Rational& rat, uint32_t wbitno);
|
||||||
void CheckAndAddLastBinOpToHistory(bool addToHistory = true);
|
void CheckAndAddLastBinOpToHistory(bool addToHistory = true);
|
||||||
|
|
||||||
void InitChopNumbers();
|
void InitChopNumbers();
|
||||||
|
CalcEngine::Rational GetChopNumber() const;
|
||||||
|
std::wstring GetMaxDecimalValueString() const;
|
||||||
|
|
||||||
static void LoadEngineStrings(CalculationManager::IResourceProvider& resourceProvider);
|
static void LoadEngineStrings(CalculationManager::IResourceProvider& resourceProvider);
|
||||||
static int IdStrFromCmdId(int id)
|
static int IdStrFromCmdId(int id)
|
||||||
|
@ -23,7 +23,7 @@ public:
|
|||||||
void RemoveLastOpndFromHistory();
|
void RemoveLastOpndFromHistory();
|
||||||
void AddBinOpToHistory(int nOpCode, bool isIntgerMode, bool fNoRepetition = true);
|
void AddBinOpToHistory(int nOpCode, bool isIntgerMode, bool fNoRepetition = true);
|
||||||
void ChangeLastBinOp(int nOpCode, bool fPrecInvToHigher, bool isIntgerMode);
|
void ChangeLastBinOp(int nOpCode, bool fPrecInvToHigher, bool isIntgerMode);
|
||||||
void AddUnaryOpToHistory(int nOpCode, bool fInv, ANGLE_TYPE angletype);
|
void AddUnaryOpToHistory(int nOpCode, bool fInv, AngleType angletype);
|
||||||
void AddOpenBraceToHistory();
|
void AddOpenBraceToHistory();
|
||||||
void AddCloseBraceToHistory();
|
void AddCloseBraceToHistory();
|
||||||
void PushLastOpndStart(int ichOpndStart = -1);
|
void PushLastOpndStart(int ichOpndStart = -1);
|
||||||
|
@ -4,11 +4,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// This is expected to be in same order as IDM_HEX, IDM_DEC, IDM_OCT, IDM_BIN
|
// This is expected to be in same order as IDM_HEX, IDM_DEC, IDM_OCT, IDM_BIN
|
||||||
enum eRADIX_TYPE
|
enum class RadixType
|
||||||
{
|
{
|
||||||
HEX_RADIX,
|
Hex,
|
||||||
DEC_RADIX,
|
Decimal,
|
||||||
OCT_RADIX,
|
Octal,
|
||||||
BIN_RADIX
|
Binary
|
||||||
};
|
};
|
||||||
typedef enum eRADIX_TYPE RADIX_TYPE;
|
|
||||||
|
@ -64,7 +64,7 @@ namespace CalcEngine
|
|||||||
friend bool operator<=(Rational const& lhs, Rational const& rhs);
|
friend bool operator<=(Rational const& lhs, Rational const& rhs);
|
||||||
friend bool operator>=(Rational const& lhs, Rational const& rhs);
|
friend bool operator>=(Rational const& lhs, Rational const& rhs);
|
||||||
|
|
||||||
std::wstring ToString(uint32_t radix, NUMOBJ_FMT format, int32_t precision) const;
|
std::wstring ToString(uint32_t radix, NumberFormat format, int32_t precision) const;
|
||||||
uint64_t ToUInt64_t() const;
|
uint64_t ToUInt64_t() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -22,12 +22,12 @@ namespace CalcEngine::RationalMath
|
|||||||
Rational Invert(Rational const& rat);
|
Rational Invert(Rational const& rat);
|
||||||
Rational Abs(Rational const& rat);
|
Rational Abs(Rational const& rat);
|
||||||
|
|
||||||
Rational Sin(Rational const& rat, ANGLE_TYPE angletype);
|
Rational Sin(Rational const& rat, AngleType angletype);
|
||||||
Rational Cos(Rational const& rat, ANGLE_TYPE angletype);
|
Rational Cos(Rational const& rat, AngleType angletype);
|
||||||
Rational Tan(Rational const& rat, ANGLE_TYPE angletype);
|
Rational Tan(Rational const& rat, AngleType angletype);
|
||||||
Rational ASin(Rational const& rat, ANGLE_TYPE angletype);
|
Rational ASin(Rational const& rat, AngleType angletype);
|
||||||
Rational ACos(Rational const& rat, ANGLE_TYPE angletype);
|
Rational ACos(Rational const& rat, AngleType angletype);
|
||||||
Rational ATan(Rational const& rat, ANGLE_TYPE angletype);
|
Rational ATan(Rational const& rat, AngleType angletype);
|
||||||
|
|
||||||
Rational Sinh(Rational const& rat);
|
Rational Sinh(Rational const& rat);
|
||||||
Rational Cosh(Rational const& rat);
|
Rational Cosh(Rational const& rat);
|
||||||
|
@ -1063,27 +1063,27 @@ bool stripzeroesnum(_Inout_ PNUMBER pnum, int32_t starting)
|
|||||||
// FUNCTION: NumberToString
|
// FUNCTION: NumberToString
|
||||||
//
|
//
|
||||||
// ARGUMENTS: number representation
|
// ARGUMENTS: number representation
|
||||||
// fmt, one of FMT_FLOAT FMT_SCIENTIFIC or
|
// fmt, one of NumberFormat::Float, NumberFormat::Scientific or
|
||||||
// FMT_ENGINEERING
|
// NumberFormat::Engineering
|
||||||
// integer radix and int32_t precision value
|
// integer radix and int32_t precision value
|
||||||
//
|
//
|
||||||
// RETURN: String representation of number.
|
// RETURN: String representation of number.
|
||||||
//
|
//
|
||||||
// DESCRIPTION: Converts a number to it's string
|
// DESCRIPTION: Converts a number to its string
|
||||||
// representation.
|
// representation.
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_t precision)
|
wstring NumberToString(_Inout_ PNUMBER& pnum, NumberFormat format, uint32_t radix, int32_t precision)
|
||||||
{
|
{
|
||||||
stripzeroesnum(pnum, precision + 2);
|
stripzeroesnum(pnum, precision + 2);
|
||||||
int32_t length = pnum->cdigit;
|
int32_t length = pnum->cdigit;
|
||||||
int32_t exponent = pnum->exp + length; // Actual number of digits to the left of decimal
|
int32_t exponent = pnum->exp + length; // Actual number of digits to the left of decimal
|
||||||
|
|
||||||
int32_t oldFormat = format;
|
NumberFormat oldFormat = format;
|
||||||
if (exponent > precision && format == FMT_FLOAT)
|
if (exponent > precision && format == NumberFormat::Float)
|
||||||
{
|
{
|
||||||
// Force scientific mode to prevent user from assuming 33rd digit is exact.
|
// Force scientific mode to prevent user from assuming 33rd digit is exact.
|
||||||
format = FMT_SCIENTIFIC;
|
format = NumberFormat::Scientific;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make length small enough to fit in pret.
|
// Make length small enough to fit in pret.
|
||||||
@ -1103,7 +1103,7 @@ wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_
|
|||||||
divnum(&round, num_two, radix, precision);
|
divnum(&round, num_two, radix, precision);
|
||||||
|
|
||||||
// Make round number exponent one below the LSD for the number.
|
// Make round number exponent one below the LSD for the number.
|
||||||
if (exponent > 0 || format == FMT_FLOAT)
|
if (exponent > 0 || format == NumberFormat::Float)
|
||||||
{
|
{
|
||||||
round->exp = pnum->exp + pnum->cdigit - round->cdigit - precision;
|
round->exp = pnum->exp + pnum->cdigit - round->cdigit - precision;
|
||||||
}
|
}
|
||||||
@ -1116,7 +1116,7 @@ wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_
|
|||||||
round->sign = pnum->sign;
|
round->sign = pnum->sign;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format == FMT_FLOAT)
|
if (format == NumberFormat::Float)
|
||||||
{
|
{
|
||||||
// Figure out if the exponent will fill more space than the non-exponent field.
|
// Figure out if the exponent will fill more space than the non-exponent field.
|
||||||
if ((length - exponent > precision) || (exponent > precision + 3))
|
if ((length - exponent > precision) || (exponent > precision + 3))
|
||||||
@ -1130,7 +1130,7 @@ wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_
|
|||||||
{
|
{
|
||||||
// Case where too many zeros are to the right or left of the
|
// Case where too many zeros are to the right or left of the
|
||||||
// decimal pt. And we are forced to switch to scientific form.
|
// decimal pt. And we are forced to switch to scientific form.
|
||||||
format = FMT_SCIENTIFIC;
|
format = NumberFormat::Scientific;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (length + abs(exponent) < precision && round)
|
else if (length + abs(exponent) < precision && round)
|
||||||
@ -1163,13 +1163,13 @@ wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_
|
|||||||
int32_t eout = exponent - 1; // Displayed exponent.
|
int32_t eout = exponent - 1; // Displayed exponent.
|
||||||
MANTTYPE* pmant = pnum->mant + pnum->cdigit - 1;
|
MANTTYPE* pmant = pnum->mant + pnum->cdigit - 1;
|
||||||
// Case where too many digits are to the left of the decimal or
|
// Case where too many digits are to the left of the decimal or
|
||||||
// FMT_SCIENTIFIC or FMT_ENGINEERING was specified.
|
// NumberFormat::Scientific or NumberFormat::Engineering was specified.
|
||||||
if ((format == FMT_SCIENTIFIC) || (format == FMT_ENGINEERING))
|
if ((format == NumberFormat::Scientific) || (format == NumberFormat::Engineering))
|
||||||
{
|
{
|
||||||
useSciForm = true;
|
useSciForm = true;
|
||||||
if (eout != 0)
|
if (eout != 0)
|
||||||
{
|
{
|
||||||
if (format == FMT_ENGINEERING)
|
if (format == NumberFormat::Engineering)
|
||||||
{
|
{
|
||||||
exponent = (eout % 3);
|
exponent = (eout % 3);
|
||||||
eout -= exponent;
|
eout -= exponent;
|
||||||
@ -1270,7 +1270,7 @@ wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_
|
|||||||
// ARGUMENTS:
|
// ARGUMENTS:
|
||||||
// PRAT *representation of a number.
|
// PRAT *representation of a number.
|
||||||
// i32 representation of base to dump to screen.
|
// i32 representation of base to dump to screen.
|
||||||
// fmt, one of FMT_FLOAT FMT_SCIENTIFIC or FMT_ENGINEERING
|
// fmt, one of NumberFormat::Float, NumberFormat::Scientific, or NumberFormat::Engineering
|
||||||
// precision uint32_t
|
// precision uint32_t
|
||||||
//
|
//
|
||||||
// RETURN: string
|
// RETURN: string
|
||||||
@ -1283,7 +1283,7 @@ wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_
|
|||||||
// why a pointer to the rational is passed in.
|
// why a pointer to the rational is passed in.
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
wstring RatToString(_Inout_ PRAT& prat, int format, uint32_t radix, int32_t precision)
|
wstring RatToString(_Inout_ PRAT& prat, NumberFormat format, uint32_t radix, int32_t precision)
|
||||||
{
|
{
|
||||||
PNUMBER p = RatToNumber(prat, radix, precision);
|
PNUMBER p = RatToNumber(prat, radix, precision);
|
||||||
|
|
||||||
|
@ -17,17 +17,17 @@
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
#include "ratpak.h"
|
#include "ratpak.h"
|
||||||
|
|
||||||
void ascalerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, int32_t precision)
|
void ascalerat(_Inout_ PRAT* pa, AngleType angletype, int32_t precision)
|
||||||
{
|
{
|
||||||
switch (angletype)
|
switch (angletype)
|
||||||
{
|
{
|
||||||
case ANGLE_RAD:
|
case AngleType::Radians:
|
||||||
break;
|
break;
|
||||||
case ANGLE_DEG:
|
case AngleType::Degrees:
|
||||||
divrat(pa, two_pi, precision);
|
divrat(pa, two_pi, precision);
|
||||||
mulrat(pa, rat_360, precision);
|
mulrat(pa, rat_360, precision);
|
||||||
break;
|
break;
|
||||||
case ANGLE_GRAD:
|
case AngleType::Gradians:
|
||||||
divrat(pa, two_pi, precision);
|
divrat(pa, two_pi, precision);
|
||||||
mulrat(pa, rat_400, precision);
|
mulrat(pa, rat_400, precision);
|
||||||
break;
|
break;
|
||||||
@ -76,7 +76,7 @@ void _asinrat(PRAT* px, int32_t precision)
|
|||||||
DESTROYTAYLOR();
|
DESTROYTAYLOR();
|
||||||
}
|
}
|
||||||
|
|
||||||
void asinanglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void asinanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
|
|
||||||
{
|
{
|
||||||
asinrat(pa, radix, precision);
|
asinrat(pa, radix, precision);
|
||||||
@ -164,7 +164,7 @@ void asinrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
|
|||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void acosanglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void acosanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
|
|
||||||
{
|
{
|
||||||
acosrat(pa, radix, precision);
|
acosrat(pa, radix, precision);
|
||||||
@ -249,7 +249,7 @@ void acosrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
|
|||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void atananglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void atananglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
|
|
||||||
{
|
{
|
||||||
atanrat(pa, radix, precision);
|
atanrat(pa, radix, precision);
|
||||||
|
@ -31,25 +31,20 @@ static constexpr uint32_t BASEX = 0x80000000; // Internal radix used in calculat
|
|||||||
typedef uint32_t MANTTYPE;
|
typedef uint32_t MANTTYPE;
|
||||||
typedef uint64_t TWO_MANTTYPE;
|
typedef uint64_t TWO_MANTTYPE;
|
||||||
|
|
||||||
enum eNUMOBJ_FMT
|
enum class NumberFormat
|
||||||
{
|
{
|
||||||
FMT_FLOAT, // returns floating point, or exponential if number is too big
|
Float, // returns floating point, or exponential if number is too big
|
||||||
FMT_SCIENTIFIC, // always returns scientific notation
|
Scientific, // always returns scientific notation
|
||||||
FMT_ENGINEERING // always returns engineering notation such that exponent is a multiple of 3
|
Engineering // always returns engineering notation such that exponent is a multiple of 3
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eANGLE_TYPE
|
enum class AngleType
|
||||||
{
|
{
|
||||||
ANGLE_DEG, // Calculate trig using 360 degrees per revolution
|
Degrees, // Calculate trig using 360 degrees per revolution
|
||||||
ANGLE_RAD, // Calculate trig using 2 pi radians per revolution
|
Radians, // Calculate trig using 2 pi radians per revolution
|
||||||
ANGLE_GRAD // Calculate trig using 400 gradients per revolution
|
Gradians // Calculate trig using 400 gradians per revolution
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum eNUMOBJ_FMT NUMOBJ_FMT;
|
|
||||||
typedef enum eANGLE_TYPE ANGLE_TYPE;
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// NUMBER type is a representation of a generic sized generic radix number
|
// NUMBER type is a representation of a generic sized generic radix number
|
||||||
@ -341,10 +336,10 @@ extern bool equnum(_In_ PNUMBER a, _In_ PNUMBER b); // returns true of a == b
|
|||||||
extern bool lessnum(_In_ PNUMBER a, _In_ PNUMBER b); // returns true of a < b
|
extern bool lessnum(_In_ PNUMBER a, _In_ PNUMBER b); // returns true of a < b
|
||||||
extern bool zernum(_In_ PNUMBER a); // returns true of a == 0
|
extern bool zernum(_In_ PNUMBER a); // returns true of a == 0
|
||||||
extern bool zerrat(_In_ PRAT a); // returns true if a == 0/q
|
extern bool zerrat(_In_ PRAT a); // returns true if a == 0/q
|
||||||
extern std::wstring NumberToString(_Inout_ PNUMBER& pnum, int format, uint32_t radix, int32_t precision);
|
extern std::wstring NumberToString(_Inout_ PNUMBER& pnum, NumberFormat format, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
// returns a text representation of a PRAT
|
// returns a text representation of a PRAT
|
||||||
extern std::wstring RatToString(_Inout_ PRAT& prat, int format, uint32_t radix, int32_t precision);
|
extern std::wstring RatToString(_Inout_ PRAT& prat, NumberFormat format, uint32_t radix, int32_t precision);
|
||||||
// converts a PRAT into a PNUMBER
|
// converts a PRAT into a PNUMBER
|
||||||
extern PNUMBER RatToNumber(_In_ PRAT prat, uint32_t radix, int32_t precision);
|
extern PNUMBER RatToNumber(_In_ PRAT prat, uint32_t radix, int32_t precision);
|
||||||
// flattens a PRAT by converting it to a PNUMBER and back to a PRAT
|
// flattens a PRAT by converting it to a PNUMBER and back to a PRAT
|
||||||
@ -376,7 +371,7 @@ extern PRAT _createrat(void);
|
|||||||
|
|
||||||
// returns a new rat structure with the acos of x->p/x->q taking into account
|
// returns a new rat structure with the acos of x->p/x->q taking into account
|
||||||
// angle type
|
// angle type
|
||||||
extern void acosanglerat(_Inout_ PRAT* px, ANGLE_TYPE angletype, uint32_t radix, int32_t precision);
|
extern void acosanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
// returns a new rat structure with the acosh of x->p/x->q
|
// returns a new rat structure with the acosh of x->p/x->q
|
||||||
extern void acoshrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
extern void acoshrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
||||||
@ -386,7 +381,7 @@ extern void acosrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
|||||||
|
|
||||||
// returns a new rat structure with the asin of x->p/x->q taking into account
|
// returns a new rat structure with the asin of x->p/x->q taking into account
|
||||||
// angle type
|
// angle type
|
||||||
extern void asinanglerat(_Inout_ PRAT* px, ANGLE_TYPE angletype, uint32_t radix, int32_t precision);
|
extern void asinanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
extern void asinhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
extern void asinhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
||||||
// returns a new rat structure with the asinh of x->p/x->q
|
// returns a new rat structure with the asinh of x->p/x->q
|
||||||
@ -396,7 +391,7 @@ extern void asinrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
|||||||
|
|
||||||
// returns a new rat structure with the atan of x->p/x->q taking into account
|
// returns a new rat structure with the atan of x->p/x->q taking into account
|
||||||
// angle type
|
// angle type
|
||||||
extern void atananglerat(_Inout_ PRAT* px, ANGLE_TYPE angletype, uint32_t radix, int32_t precision);
|
extern void atananglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
// returns a new rat structure with the atanh of x->p/x->q
|
// returns a new rat structure with the atanh of x->p/x->q
|
||||||
extern void atanhrat(_Inout_ PRAT* px, int32_t precision);
|
extern void atanhrat(_Inout_ PRAT* px, int32_t precision);
|
||||||
@ -412,7 +407,7 @@ extern void cosrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
|||||||
|
|
||||||
// returns a new rat structure with the cos of x->p/x->q taking into account
|
// returns a new rat structure with the cos of x->p/x->q taking into account
|
||||||
// angle type
|
// angle type
|
||||||
extern void cosanglerat(_Inout_ PRAT* px, ANGLE_TYPE angletype, uint32_t radix, int32_t precision);
|
extern void cosanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
// returns a new rat structure with the exp of x->p/x->q this should not be called explicitly.
|
// returns a new rat structure with the exp of x->p/x->q this should not be called explicitly.
|
||||||
extern void _exprat(_Inout_ PRAT* px, int32_t precision);
|
extern void _exprat(_Inout_ PRAT* px, int32_t precision);
|
||||||
@ -435,14 +430,14 @@ extern void sinrat(_Inout_ PRAT* px);
|
|||||||
|
|
||||||
// returns a new rat structure with the sin of x->p/x->q taking into account
|
// returns a new rat structure with the sin of x->p/x->q taking into account
|
||||||
// angle type
|
// angle type
|
||||||
extern void sinanglerat(_Inout_ PRAT* px, ANGLE_TYPE angletype, uint32_t radix, int32_t precision);
|
extern void sinanglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
extern void tanhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
extern void tanhrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
||||||
extern void tanrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
extern void tanrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
// returns a new rat structure with the tan of x->p/x->q taking into account
|
// returns a new rat structure with the tan of x->p/x->q taking into account
|
||||||
// angle type
|
// angle type
|
||||||
extern void tananglerat(_Inout_ PRAT* px, ANGLE_TYPE angletype, uint32_t radix, int32_t precision);
|
extern void tananglerat(_Inout_ PRAT* px, AngleType angletype, uint32_t radix, int32_t precision);
|
||||||
|
|
||||||
extern void _dupnum(_In_ PNUMBER dest, _In_ const NUMBER* const src);
|
extern void _dupnum(_In_ PNUMBER dest, _In_ const NUMBER* const src);
|
||||||
|
|
||||||
|
@ -16,17 +16,17 @@
|
|||||||
|
|
||||||
#include "ratpak.h"
|
#include "ratpak.h"
|
||||||
|
|
||||||
void scalerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void scalerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
{
|
{
|
||||||
switch (angletype)
|
switch (angletype)
|
||||||
{
|
{
|
||||||
case ANGLE_RAD:
|
case AngleType::Radians:
|
||||||
scale2pi(pa, radix, precision);
|
scale2pi(pa, radix, precision);
|
||||||
break;
|
break;
|
||||||
case ANGLE_DEG:
|
case AngleType::Degrees:
|
||||||
scale(pa, rat_360, radix, precision);
|
scale(pa, rat_360, radix, precision);
|
||||||
break;
|
break;
|
||||||
case ANGLE_GRAD:
|
case AngleType::Gradians:
|
||||||
scale(pa, rat_400, radix, precision);
|
scale(pa, rat_400, radix, precision);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -98,13 +98,13 @@ void sinrat(PRAT* px, uint32_t radix, int32_t precision)
|
|||||||
_sinrat(px, precision);
|
_sinrat(px, precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sinanglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void sinanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
|
|
||||||
{
|
{
|
||||||
scalerat(pa, angletype, radix, precision);
|
scalerat(pa, angletype, radix, precision);
|
||||||
switch (angletype)
|
switch (angletype)
|
||||||
{
|
{
|
||||||
case ANGLE_DEG:
|
case AngleType::Degrees:
|
||||||
if (rat_gt(*pa, rat_180, precision))
|
if (rat_gt(*pa, rat_180, precision))
|
||||||
{
|
{
|
||||||
subrat(pa, rat_360, precision);
|
subrat(pa, rat_360, precision);
|
||||||
@ -112,7 +112,7 @@ void sinanglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t
|
|||||||
divrat(pa, rat_180, precision);
|
divrat(pa, rat_180, precision);
|
||||||
mulrat(pa, pi, precision);
|
mulrat(pa, pi, precision);
|
||||||
break;
|
break;
|
||||||
case ANGLE_GRAD:
|
case AngleType::Gradians:
|
||||||
if (rat_gt(*pa, rat_200, precision))
|
if (rat_gt(*pa, rat_200, precision))
|
||||||
{
|
{
|
||||||
subrat(pa, rat_400, precision);
|
subrat(pa, rat_400, precision);
|
||||||
@ -193,13 +193,13 @@ void cosrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
|
|||||||
_cosrat(px, radix, precision);
|
_cosrat(px, radix, precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cosanglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void cosanglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
|
|
||||||
{
|
{
|
||||||
scalerat(pa, angletype, radix, precision);
|
scalerat(pa, angletype, radix, precision);
|
||||||
switch (angletype)
|
switch (angletype)
|
||||||
{
|
{
|
||||||
case ANGLE_DEG:
|
case AngleType::Degrees:
|
||||||
if (rat_gt(*pa, rat_180, precision))
|
if (rat_gt(*pa, rat_180, precision))
|
||||||
{
|
{
|
||||||
PRAT ptmp = nullptr;
|
PRAT ptmp = nullptr;
|
||||||
@ -211,7 +211,7 @@ void cosanglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t
|
|||||||
divrat(pa, rat_180, precision);
|
divrat(pa, rat_180, precision);
|
||||||
mulrat(pa, pi, precision);
|
mulrat(pa, pi, precision);
|
||||||
break;
|
break;
|
||||||
case ANGLE_GRAD:
|
case AngleType::Gradians:
|
||||||
if (rat_gt(*pa, rat_200, precision))
|
if (rat_gt(*pa, rat_200, precision))
|
||||||
{
|
{
|
||||||
PRAT ptmp = nullptr;
|
PRAT ptmp = nullptr;
|
||||||
@ -263,13 +263,13 @@ void tanrat(_Inout_ PRAT* px, uint32_t radix, int32_t precision)
|
|||||||
_tanrat(px, radix, precision);
|
_tanrat(px, radix, precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tananglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t precision)
|
void tananglerat(_Inout_ PRAT* pa, AngleType angletype, uint32_t radix, int32_t precision)
|
||||||
|
|
||||||
{
|
{
|
||||||
scalerat(pa, angletype, radix, precision);
|
scalerat(pa, angletype, radix, precision);
|
||||||
switch (angletype)
|
switch (angletype)
|
||||||
{
|
{
|
||||||
case ANGLE_DEG:
|
case AngleType::Degrees:
|
||||||
if (rat_gt(*pa, rat_180, precision))
|
if (rat_gt(*pa, rat_180, precision))
|
||||||
{
|
{
|
||||||
subrat(pa, rat_180, precision);
|
subrat(pa, rat_180, precision);
|
||||||
@ -277,7 +277,7 @@ void tananglerat(_Inout_ PRAT* pa, ANGLE_TYPE angletype, uint32_t radix, int32_t
|
|||||||
divrat(pa, rat_180, precision);
|
divrat(pa, rat_180, precision);
|
||||||
mulrat(pa, pi, precision);
|
mulrat(pa, pi, precision);
|
||||||
break;
|
break;
|
||||||
case ANGLE_GRAD:
|
case AngleType::Gradians:
|
||||||
if (rat_gt(*pa, rat_200, precision))
|
if (rat_gt(*pa, rat_200, precision))
|
||||||
{
|
{
|
||||||
subrat(pa, rat_200, precision);
|
subrat(pa, rat_200, precision);
|
||||||
|
@ -41,11 +41,11 @@ void HistoryViewModel::ReloadHistory(_In_ ViewMode currentMode)
|
|||||||
{
|
{
|
||||||
if (currentMode == ViewMode::Standard)
|
if (currentMode == ViewMode::Standard)
|
||||||
{
|
{
|
||||||
m_currentMode = CalculationManager::CALCULATOR_MODE::CM_STD;
|
m_currentMode = CalculationManager::CalculatorMode::Standard;
|
||||||
}
|
}
|
||||||
else if (currentMode == ViewMode::Scientific)
|
else if (currentMode == ViewMode::Scientific)
|
||||||
{
|
{
|
||||||
m_currentMode = CalculationManager::CALCULATOR_MODE::CM_SCI;
|
m_currentMode = CalculationManager::CalculatorMode::Scientific;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -127,7 +127,7 @@ void HistoryViewModel::DeleteItem(_In_ HistoryItemViewModel ^ e)
|
|||||||
{
|
{
|
||||||
// Keys for the history container are index based.
|
// Keys for the history container are index based.
|
||||||
// SaveHistory() re-inserts the items anyway, so it's faster to just clear out the container.
|
// SaveHistory() re-inserts the items anyway, so it's faster to just clear out the container.
|
||||||
CalculationManager::CALCULATOR_MODE currentMode = m_currentMode;
|
CalculationManager::CalculatorMode currentMode = m_currentMode;
|
||||||
ApplicationDataContainer ^ historyContainer = GetHistoryContainer(currentMode);
|
ApplicationDataContainer ^ historyContainer = GetHistoryContainer(currentMode);
|
||||||
historyContainer->Values->Clear();
|
historyContainer->Values->Clear();
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ void HistoryViewModel::OnClearCommand(_In_ Platform::Object ^ e)
|
|||||||
|
|
||||||
if (Items->Size > 0)
|
if (Items->Size > 0)
|
||||||
{
|
{
|
||||||
CalculationManager::CALCULATOR_MODE currentMode = m_currentMode;
|
CalculationManager::CalculatorMode currentMode = m_currentMode;
|
||||||
ClearHistoryContainer(currentMode);
|
ClearHistoryContainer(currentMode);
|
||||||
Items->Clear();
|
Items->Clear();
|
||||||
UpdateItemSize();
|
UpdateItemSize();
|
||||||
@ -167,7 +167,7 @@ void HistoryViewModel::OnClearCommand(_In_ Platform::Object ^ e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// this method restores history vector per mode
|
// this method restores history vector per mode
|
||||||
void HistoryViewModel::RestoreHistory(_In_ CalculationManager::CALCULATOR_MODE cMode)
|
void HistoryViewModel::RestoreHistory(_In_ CalculationManager::CalculatorMode cMode)
|
||||||
{
|
{
|
||||||
ApplicationDataContainer ^ historyContainer = GetHistoryContainer(cMode);
|
ApplicationDataContainer ^ historyContainer = GetHistoryContainer(cMode);
|
||||||
std::shared_ptr<std::vector<std::shared_ptr<CalculationManager::HISTORYITEM>>> historyVector =
|
std::shared_ptr<std::vector<std::shared_ptr<CalculationManager::HISTORYITEM>>> historyVector =
|
||||||
@ -209,13 +209,13 @@ void HistoryViewModel::RestoreHistory(_In_ CalculationManager::CALCULATOR_MODE c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Platform::String ^ HistoryViewModel::GetHistoryContainerKey(_In_ CalculationManager::CALCULATOR_MODE cMode)
|
Platform::String ^ HistoryViewModel::GetHistoryContainerKey(_In_ CalculationManager::CalculatorMode cMode)
|
||||||
{
|
{
|
||||||
Platform::ValueType ^ modeValue = static_cast<int>(cMode);
|
Platform::ValueType ^ modeValue = static_cast<int>(cMode);
|
||||||
return Platform::String::Concat(modeValue->ToString(), L"_History");
|
return Platform::String::Concat(modeValue->ToString(), L"_History");
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplicationDataContainer ^ HistoryViewModel::GetHistoryContainer(_In_ CalculationManager::CALCULATOR_MODE cMode)
|
ApplicationDataContainer ^ HistoryViewModel::GetHistoryContainer(_In_ CalculationManager::CalculatorMode cMode)
|
||||||
{
|
{
|
||||||
ApplicationDataContainer ^ localSettings = ApplicationData::Current->LocalSettings;
|
ApplicationDataContainer ^ localSettings = ApplicationData::Current->LocalSettings;
|
||||||
ApplicationDataContainer ^ historyContainer;
|
ApplicationDataContainer ^ historyContainer;
|
||||||
@ -238,14 +238,14 @@ ApplicationDataContainer ^ HistoryViewModel::GetHistoryContainer(_In_ Calculatio
|
|||||||
return historyContainer;
|
return historyContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryViewModel::ClearHistoryContainer(_In_ CalculationManager::CALCULATOR_MODE cMode)
|
void HistoryViewModel::ClearHistoryContainer(_In_ CalculationManager::CalculatorMode cMode)
|
||||||
{
|
{
|
||||||
ApplicationDataContainer ^ localSettings = ApplicationData::Current->LocalSettings;
|
ApplicationDataContainer ^ localSettings = ApplicationData::Current->LocalSettings;
|
||||||
localSettings->DeleteContainer(GetHistoryContainerKey(cMode));
|
localSettings->DeleteContainer(GetHistoryContainerKey(cMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
// this method will be used to update the history item length
|
// this method will be used to update the history item length
|
||||||
void HistoryViewModel::UpdateHistoryVectorLength(_In_ int newValue, _In_ CalculationManager::CALCULATOR_MODE cMode)
|
void HistoryViewModel::UpdateHistoryVectorLength(_In_ int newValue, _In_ CalculationManager::CalculatorMode cMode)
|
||||||
{
|
{
|
||||||
ApplicationDataContainer ^ historyContainer = GetHistoryContainer(cMode);
|
ApplicationDataContainer ^ historyContainer = GetHistoryContainer(cMode);
|
||||||
historyContainer->Values->Remove(HistoryVectorLengthKey);
|
historyContainer->Values->Remove(HistoryVectorLengthKey);
|
||||||
@ -254,8 +254,8 @@ void HistoryViewModel::UpdateHistoryVectorLength(_In_ int newValue, _In_ Calcula
|
|||||||
|
|
||||||
void HistoryViewModel::ClearHistory()
|
void HistoryViewModel::ClearHistory()
|
||||||
{
|
{
|
||||||
ClearHistoryContainer(CalculationManager::CALCULATOR_MODE::CM_STD);
|
ClearHistoryContainer(CalculationManager::CalculatorMode::Standard);
|
||||||
ClearHistoryContainer(CalculationManager::CALCULATOR_MODE::CM_SCI);
|
ClearHistoryContainer(CalculationManager::CalculatorMode::Scientific);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryViewModel::SaveHistory()
|
void HistoryViewModel::SaveHistory()
|
||||||
|
@ -55,16 +55,16 @@ namespace CalculatorApp
|
|||||||
private:
|
private:
|
||||||
CalculationManager::CalculatorManager* const m_calculatorManager;
|
CalculationManager::CalculatorManager* const m_calculatorManager;
|
||||||
CalculatorDisplay m_calculatorDisplay;
|
CalculatorDisplay m_calculatorDisplay;
|
||||||
CalculationManager::CALCULATOR_MODE m_currentMode;
|
CalculationManager::CalculatorMode m_currentMode;
|
||||||
Platform::String ^ m_localizedHistoryCleared;
|
Platform::String ^ m_localizedHistoryCleared;
|
||||||
|
|
||||||
void RestoreHistory(_In_ CalculationManager::CALCULATOR_MODE cMode);
|
void RestoreHistory(_In_ CalculationManager::CalculatorMode cMode);
|
||||||
CalculationManager::HISTORYITEM
|
CalculationManager::HISTORYITEM
|
||||||
DeserializeHistoryItem(_In_ Platform::String ^ historyItemKey, _In_ Windows::Storage::ApplicationDataContainer ^ historyContainer);
|
DeserializeHistoryItem(_In_ Platform::String ^ historyItemKey, _In_ Windows::Storage::ApplicationDataContainer ^ historyContainer);
|
||||||
Windows::Storage::ApplicationDataContainer ^ GetHistoryContainer(_In_ CalculationManager::CALCULATOR_MODE cMode);
|
Windows::Storage::ApplicationDataContainer ^ GetHistoryContainer(_In_ CalculationManager::CalculatorMode cMode);
|
||||||
Platform::String ^ GetHistoryContainerKey(_In_ CalculationManager::CALCULATOR_MODE cMode);
|
Platform::String ^ GetHistoryContainerKey(_In_ CalculationManager::CalculatorMode cMode);
|
||||||
void ClearHistoryContainer(_In_ CalculationManager::CALCULATOR_MODE cMode);
|
void ClearHistoryContainer(_In_ CalculationManager::CalculatorMode cMode);
|
||||||
void UpdateHistoryVectorLength(_In_ int newValue, _In_ CalculationManager::CALCULATOR_MODE cMode);
|
void UpdateHistoryVectorLength(_In_ int newValue, _In_ CalculationManager::CalculatorMode cMode);
|
||||||
bool IsValid(_In_ CalculationManager::HISTORYITEM item);
|
bool IsValid(_In_ CalculationManager::HISTORYITEM item);
|
||||||
|
|
||||||
friend class CalculatorDisplay;
|
friend class CalculatorDisplay;
|
||||||
|
@ -679,18 +679,18 @@ void StandardCalculatorViewModel::OnButtonPressed(Object ^ parameter)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RADIX_TYPE StandardCalculatorViewModel::GetRadixTypeFromNumberBase(NumberBase base)
|
RadixType StandardCalculatorViewModel::GetRadixTypeFromNumberBase(NumberBase base)
|
||||||
{
|
{
|
||||||
switch (base)
|
switch (base)
|
||||||
{
|
{
|
||||||
case NumberBase::BinBase:
|
case NumberBase::BinBase:
|
||||||
return RADIX_TYPE::BIN_RADIX;
|
return RadixType::Binary;
|
||||||
case NumberBase::HexBase:
|
case NumberBase::HexBase:
|
||||||
return RADIX_TYPE::HEX_RADIX;
|
return RadixType::Hex;
|
||||||
case NumberBase::OctBase:
|
case NumberBase::OctBase:
|
||||||
return RADIX_TYPE::OCT_RADIX;
|
return RadixType::Octal;
|
||||||
default:
|
default:
|
||||||
return RADIX_TYPE::DEC_RADIX;
|
return RadixType::Decimal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1228,7 +1228,7 @@ void StandardCalculatorViewModel::ResetDisplay()
|
|||||||
{
|
{
|
||||||
AreHEXButtonsEnabled = false;
|
AreHEXButtonsEnabled = false;
|
||||||
CurrentRadixType = NumberBase::DecBase;
|
CurrentRadixType = NumberBase::DecBase;
|
||||||
m_standardCalculatorManager.SetRadix(DEC_RADIX);
|
m_standardCalculatorManager.SetRadix(RadixType::Decimal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StandardCalculatorViewModel::SetPrecision(int32_t precision)
|
void StandardCalculatorViewModel::SetPrecision(int32_t precision)
|
||||||
@ -1253,16 +1253,16 @@ void StandardCalculatorViewModel::SetMemorizedNumbersString()
|
|||||||
m_standardCalculatorManager.SetMemorizedNumbersString();
|
m_standardCalculatorManager.SetMemorizedNumbersString();
|
||||||
}
|
}
|
||||||
|
|
||||||
ANGLE_TYPE GetAngleTypeFromCommand(Command command)
|
AngleType GetAngleTypeFromCommand(Command command)
|
||||||
{
|
{
|
||||||
switch (command)
|
switch (command)
|
||||||
{
|
{
|
||||||
case Command::CommandDEG:
|
case Command::CommandDEG:
|
||||||
return ANGLE_DEG;
|
return AngleType::Degrees;
|
||||||
case Command::CommandRAD:
|
case Command::CommandRAD:
|
||||||
return ANGLE_RAD;
|
return AngleType::Radians;
|
||||||
case Command::CommandGRAD:
|
case Command::CommandGRAD:
|
||||||
return ANGLE_GRAD;
|
return AngleType::Gradians;
|
||||||
default:
|
default:
|
||||||
throw ref new Exception(E_FAIL, L"Invalid command type");
|
throw ref new Exception(E_FAIL, L"Invalid command type");
|
||||||
}
|
}
|
||||||
@ -1279,7 +1279,7 @@ void StandardCalculatorViewModel::SaveEditedCommand(_In_ unsigned int tokenPosit
|
|||||||
if (IsUnaryOp(command) && command != Command::CommandSIGN)
|
if (IsUnaryOp(command) && command != Command::CommandSIGN)
|
||||||
{
|
{
|
||||||
int angleCmd = static_cast<int>(m_standardCalculatorManager.GetCurrentDegreeMode());
|
int angleCmd = static_cast<int>(m_standardCalculatorManager.GetCurrentDegreeMode());
|
||||||
ANGLE_TYPE angleType = GetAngleTypeFromCommand(static_cast<Command>(angleCmd));
|
AngleType angleType = GetAngleTypeFromCommand(static_cast<Command>(angleCmd));
|
||||||
|
|
||||||
if (IsTrigOp(command))
|
if (IsTrigOp(command))
|
||||||
{
|
{
|
||||||
|
@ -307,7 +307,7 @@ namespace CalculatorApp
|
|||||||
_Inout_ std::shared_ptr<std::vector<std::shared_ptr<IExpressionCommand>>> const& commands);
|
_Inout_ std::shared_ptr<std::vector<std::shared_ptr<IExpressionCommand>>> const& commands);
|
||||||
void SetTokens(_Inout_ std::shared_ptr<std::vector<std::pair<std::wstring, int>>> const& tokens);
|
void SetTokens(_Inout_ std::shared_ptr<std::vector<std::pair<std::wstring, int>>> const& tokens);
|
||||||
NumbersAndOperatorsEnum ConvertIntegerToNumbersAndOperatorsEnum(unsigned int parameter);
|
NumbersAndOperatorsEnum ConvertIntegerToNumbersAndOperatorsEnum(unsigned int parameter);
|
||||||
static RADIX_TYPE GetRadixTypeFromNumberBase(CalculatorApp::Common::NumberBase base);
|
static RadixType GetRadixTypeFromNumberBase(CalculatorApp::Common::NumberBase base);
|
||||||
NumbersAndOperatorsEnum m_CurrentAngleType;
|
NumbersAndOperatorsEnum m_CurrentAngleType;
|
||||||
wchar_t m_decimalSeparator;
|
wchar_t m_decimalSeparator;
|
||||||
CalculatorDisplay m_calculatorDisplay;
|
CalculatorDisplay m_calculatorDisplay;
|
||||||
|
@ -26,22 +26,22 @@ namespace CalculatorApp
|
|||||||
auto resourceLoader = AppResourceProvider::GetInstance();
|
auto resourceLoader = AppResourceProvider::GetInstance();
|
||||||
switch (boxedInt->Value)
|
switch (boxedInt->Value)
|
||||||
{
|
{
|
||||||
case RADIX_TYPE::BIN_RADIX:
|
case RadixType::Binary:
|
||||||
{
|
{
|
||||||
convertedValue = resourceLoader->GetResourceString("Bin");
|
convertedValue = resourceLoader->GetResourceString("Bin");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RADIX_TYPE::OCT_RADIX:
|
case RadixType::Octal:
|
||||||
{
|
{
|
||||||
convertedValue = resourceLoader->GetResourceString("Oct");
|
convertedValue = resourceLoader->GetResourceString("Oct");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RADIX_TYPE::DEC_RADIX:
|
case RadixType::Decimal:
|
||||||
{
|
{
|
||||||
convertedValue = resourceLoader->GetResourceString("Dec");
|
convertedValue = resourceLoader->GetResourceString("Dec");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RADIX_TYPE::HEX_RADIX:
|
case RadixType::Hex:
|
||||||
{
|
{
|
||||||
convertedValue = resourceLoader->GetResourceString("Hex");
|
convertedValue = resourceLoader->GetResourceString("Hex");
|
||||||
break;
|
break;
|
||||||
|
@ -65,7 +65,7 @@ namespace CalculatorFunctionalTests
|
|||||||
return !(localSettings->Containers->HasKey(historyContainerKey));
|
return !(localSettings->Containers->HasKey(historyContainerKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
String^ GetHistoryContainerKeyHelper(CalculationManager::CALCULATOR_MODE cMode)
|
String^ GetHistoryContainerKeyHelper(CalculationManager::CalculatorMode cMode)
|
||||||
{
|
{
|
||||||
ValueType^ modeValue = static_cast<int>(cMode);
|
ValueType^ modeValue = static_cast<int>(cMode);
|
||||||
return String::Concat(modeValue->ToString(), L"_History");
|
return String::Concat(modeValue->ToString(), L"_History");
|
||||||
@ -204,8 +204,8 @@ namespace CalculatorFunctionalTests
|
|||||||
m_standardViewModel->m_standardCalculatorManager.SendCommand(Command::CommandEQU);
|
m_standardViewModel->m_standardCalculatorManager.SendCommand(Command::CommandEQU);
|
||||||
m_historyViewModel->OnClearCommand(nullptr);
|
m_historyViewModel->OnClearCommand(nullptr);
|
||||||
VERIFY_ARE_EQUAL(0, m_historyViewModel->ItemSize);
|
VERIFY_ARE_EQUAL(0, m_historyViewModel->ItemSize);
|
||||||
VERIFY_IS_TRUE(IsHistoryContainerEmpty(GetHistoryContainerKeyHelper(CM_STD)));
|
VERIFY_IS_TRUE(IsHistoryContainerEmpty(GetHistoryContainerKeyHelper(CalculatorMode::Standard)));
|
||||||
VERIFY_IS_TRUE(IsHistoryContainerEmpty(GetHistoryContainerKeyHelper(CM_SCI)));
|
VERIFY_IS_TRUE(IsHistoryContainerEmpty(GetHistoryContainerKeyHelper(CalculatorMode::Scientific)));
|
||||||
Cleanup();
|
Cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,25 +78,25 @@ TEST_METHOD(TestModuloRational)
|
|||||||
{
|
{
|
||||||
// Test with rational numbers
|
// Test with rational numbers
|
||||||
auto res = Mod(Rational(Number(1, 0, { 250 }), Number(1, 0, { 100 })), Rational(89));
|
auto res = Mod(Rational(Number(1, 0, { 250 }), Number(1, 0, { 100 })), Rational(89));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"2.5");
|
||||||
res = Mod(Rational(Number(1, 0, { 3330 }), Number(1, 0, { 1332 })), Rational(1));
|
res = Mod(Rational(Number(1, 0, { 3330 }), Number(1, 0, { 1332 })), Rational(1));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.5");
|
||||||
res = Mod(Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(10));
|
res = Mod(Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(10));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"2.5");
|
||||||
res = Mod(Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(10));
|
res = Mod(Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(10));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"7.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"7.5");
|
||||||
res = Mod(Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(-10));
|
res = Mod(Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(-10));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-2.5");
|
||||||
res = Mod(Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(-10));
|
res = Mod(Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })), Rational(-10));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-7.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-7.5");
|
||||||
res = Mod(Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })), Rational(1));
|
res = Mod(Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })), Rational(1));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.33333333");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.33333333");
|
||||||
res = Mod(Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })), Rational(-10));
|
res = Mod(Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })), Rational(-10));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-6.6666667");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-6.6666667");
|
||||||
res = Mod(Rational(834345), Rational(Number(1, 0, { 103 }), Number(1, 0, { 100 })));
|
res = Mod(Rational(834345), Rational(Number(1, 0, { 103 }), Number(1, 0, { 100 })));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.71");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.71");
|
||||||
res = Mod(Rational(834345), Rational(Number(-1, 0, { 103 }), Number(1, 0, { 100 })));
|
res = Mod(Rational(834345), Rational(Number(-1, 0, { 103 }), Number(1, 0, { 100 })));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-0.32");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-0.32");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_METHOD(TestRemainderOperandsNotModified)
|
TEST_METHOD(TestRemainderOperandsNotModified)
|
||||||
@ -192,29 +192,29 @@ TEST_METHOD(TestRemainderRational)
|
|||||||
{
|
{
|
||||||
// Test with rational numbers
|
// Test with rational numbers
|
||||||
auto res = Rational(Number(1, 0, { 250 }), Number(1, 0, { 100 })) % Rational(89);
|
auto res = Rational(Number(1, 0, { 250 }), Number(1, 0, { 100 })) % Rational(89);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"2.5");
|
||||||
res = Rational(Number(1, 0, { 3330 }), Number(1, 0, { 1332 })) % Rational(1);
|
res = Rational(Number(1, 0, { 3330 }), Number(1, 0, { 1332 })) % Rational(1);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.5");
|
||||||
res = Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(10);
|
res = Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(10);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"2.5");
|
||||||
res = Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(10);
|
res = Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(10);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-2.5");
|
||||||
res = Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(-10);
|
res = Rational(Number(-1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(-10);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-2.5");
|
||||||
res = Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(-10);
|
res = Rational(Number(1, 0, { 12250 }), Number(1, 0, { 100 })) % Rational(-10);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"2.5");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"2.5");
|
||||||
res = Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })) % Rational(1);
|
res = Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })) % Rational(1);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.33333333");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.33333333");
|
||||||
res = Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })) % Rational(-10);
|
res = Rational(Number(1, 0, { 1000 }), Number(1, 0, { 3 })) % Rational(-10);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"3.3333333");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"3.3333333");
|
||||||
res = Rational(Number(-1, 0, { 1000 }), Number(1, 0, { 3 })) % Rational(-10);
|
res = Rational(Number(-1, 0, { 1000 }), Number(1, 0, { 3 })) % Rational(-10);
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-3.3333333");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-3.3333333");
|
||||||
res = Rational(834345) % Rational(Number(1, 0, { 103 }), Number(1, 0, { 100 }));
|
res = Rational(834345) % Rational(Number(1, 0, { 103 }), Number(1, 0, { 100 }));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.71");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.71");
|
||||||
res = Rational(834345) % Rational(Number(-1, 0, { 103 }), Number(1, 0, { 100 }));
|
res = Rational(834345) % Rational(Number(-1, 0, { 103 }), Number(1, 0, { 100 }));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"0.71");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"0.71");
|
||||||
res = Rational(-834345) % Rational(Number(1, 0, { 103 }), Number(1, 0, { 100 }));
|
res = Rational(-834345) % Rational(Number(1, 0, { 103 }), Number(1, 0, { 100 }));
|
||||||
VERIFY_ARE_EQUAL(res.ToString(10, FMT_FLOAT, 8), L"-0.71");
|
VERIFY_ARE_EQUAL(res.ToString(10, NumberFormat::Float, 8), L"-0.71");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -510,19 +510,19 @@ namespace CalculatorUnitTests
|
|||||||
TEST_METHOD(ProgrammerModeButtonsDisable)
|
TEST_METHOD(ProgrammerModeButtonsDisable)
|
||||||
{
|
{
|
||||||
/* m_viewModel->IsProgrammer = true;
|
/* m_viewModel->IsProgrammer = true;
|
||||||
m_viewModel->SwitchProgrammerModeBase(OCT_RADIX);
|
m_viewModel->SwitchProgrammerModeBase(RadixType::Octal);
|
||||||
VERIFY_IS_TRUE(m_viewModel->AreOCTButtonsEnabled);
|
VERIFY_IS_TRUE(m_viewModel->AreOCTButtonsEnabled);
|
||||||
VERIFY_IS_FALSE(m_viewModel->AreHEXButtonsEnabled);
|
VERIFY_IS_FALSE(m_viewModel->AreHEXButtonsEnabled);
|
||||||
VERIFY_IS_FALSE(m_viewModel->AreDECButtonsEnabled);
|
VERIFY_IS_FALSE(m_viewModel->AreDECButtonsEnabled);
|
||||||
m_viewModel->SwitchProgrammerModeBase(DEC_RADIX);
|
m_viewModel->SwitchProgrammerModeBase(RadixType::Decimal);
|
||||||
VERIFY_IS_FALSE(m_viewModel->AreHEXButtonsEnabled);
|
VERIFY_IS_FALSE(m_viewModel->AreHEXButtonsEnabled);
|
||||||
VERIFY_IS_TRUE(m_viewModel->AreDECButtonsEnabled);
|
VERIFY_IS_TRUE(m_viewModel->AreDECButtonsEnabled);
|
||||||
VERIFY_IS_TRUE(m_viewModel->AreOCTButtonsEnabled);
|
VERIFY_IS_TRUE(m_viewModel->AreOCTButtonsEnabled);
|
||||||
m_viewModel->SwitchProgrammerModeBase(HEX_RADIX);
|
m_viewModel->SwitchProgrammerModeBase(RadixType::Hex);
|
||||||
VERIFY_IS_TRUE(m_viewModel->AreHEXButtonsEnabled);
|
VERIFY_IS_TRUE(m_viewModel->AreHEXButtonsEnabled);
|
||||||
VERIFY_IS_TRUE(m_viewModel->AreDECButtonsEnabled);
|
VERIFY_IS_TRUE(m_viewModel->AreDECButtonsEnabled);
|
||||||
VERIFY_IS_TRUE(m_viewModel->AreOCTButtonsEnabled);
|
VERIFY_IS_TRUE(m_viewModel->AreOCTButtonsEnabled);
|
||||||
m_viewModel->SwitchProgrammerModeBase(BIN_RADIX);
|
m_viewModel->SwitchProgrammerModeBase(RadixType::Binary);
|
||||||
VERIFY_IS_FALSE(m_viewModel->AreHEXButtonsEnabled);
|
VERIFY_IS_FALSE(m_viewModel->AreHEXButtonsEnabled);
|
||||||
VERIFY_IS_FALSE(m_viewModel->AreDECButtonsEnabled);
|
VERIFY_IS_FALSE(m_viewModel->AreDECButtonsEnabled);
|
||||||
VERIFY_IS_FALSE(m_viewModel->AreOCTButtonsEnabled);*/
|
VERIFY_IS_FALSE(m_viewModel->AreOCTButtonsEnabled);*/
|
||||||
|
Loading…
Reference in New Issue
Block a user