Skip to content

Commit bd0b575

Browse files
committed
Fix power sign issue
1 parent ad28ef6 commit bd0b575

File tree

5 files changed

+65
-28
lines changed

5 files changed

+65
-28
lines changed

include/util.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,22 @@ namespace steppable::__internals::numUtils
394394
* @return True if it is a power of 10, false otherwise.
395395
*/
396396
bool isPowerOfTen(const std::string& number);
397+
398+
/**
399+
* @brief Checks if a number is odd.
400+
*
401+
* @param number The number to be checked.
402+
* @return True if the number is odd, false otherwise.
403+
*/
404+
bool isOdd(const std::string& number);
405+
406+
/**
407+
* @brief Checks if a number is even.
408+
*
409+
* @param number The number to be checked.
410+
* @return True if the number is even, false otherwise.
411+
*/
412+
bool isEven(const std::string& number);
397413
} // namespace steppable::__internals::numUtils
398414

399415
/**

src/calc/power/power.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ namespace steppable::__internals::calc
9898

9999
auto numberNoTrailingZeros = standardizeNumber(number);
100100
size_t numberTrailingZeros = 0;
101+
auto result = splitNumber(number, "0", false, false, true, true);
101102
if (isInteger(number))
102103
{
103-
number = splitNumber(number, "0", false, false, true).splitNumberArray[0];
104+
number = result.splitNumberArray[0];
104105
numberNoTrailingZeros = removeTrailingZeros(number);
105106
numberTrailingZeros = number.length() - numberNoTrailingZeros.length();
106107
}
@@ -109,14 +110,15 @@ namespace steppable::__internals::calc
109110
// Remove the zeros to reduce the workload.
110111
number = numberNoTrailingZeros;
111112

112-
bool negative = false;
113+
bool negativePower = false;
114+
113115
if (compare(raiseTo, "0", 0) == "0")
114116
{
115117
// raiseTo is negative
116118
raiseTo = raiseTo.substr(1);
117-
negative = true;
119+
negativePower = true;
118120
}
119-
return reportPower(number, raiseTo, numberTrailingZeros, negative, steps);
121+
return reportPower(number, raiseTo, numberTrailingZeros, negativePower, steps);
120122
}
121123

122124
std::string exp(const std::string& x, const size_t decimals)

src/calc/power/powerReport.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,16 @@ std::string reportPowerRoot(const std::string& _number,
7070
std::string reportPower(const std::string& _number,
7171
const std::string& raiseTo,
7272
const size_t numberTrailingZeros,
73-
const bool negative,
73+
const bool negativePower,
7474
const int steps)
7575
{
7676
std::stringstream ss;
77-
const auto numberOrig = static_cast<std::string>(_number);
78-
79-
auto number = "1"s;
77+
auto result = "1"s;
8078

8179
// Here, we attempt to give a quick answer, instead of doing pointless iterations.
82-
if (numberOrig == "1")
80+
if (_number == "1")
8381
goto finish; // NOLINT(cppcoreguidelines-avoid-goto)
84-
if (numberOrig == "0")
82+
if (_number == "0")
8583
{
8684
if (steps == 2)
8785
// The number is 0, so the result is 0.
@@ -92,45 +90,45 @@ std::string reportPower(const std::string& _number,
9290
}
9391

9492
loop(raiseTo, [&](const auto& i) {
95-
if (not negative)
96-
number = multiply(number, numberOrig, 0);
93+
if (not negativePower)
94+
result = multiply(result, _number, 0);
9795
else
98-
number = divide("1", number, 0);
96+
result = divide("1", result, 0);
9997
auto currentPower = add(i, "1", 0);
10098
if (steps == 2)
10199
{
102-
if (not negative)
103-
ss << BECAUSE << " " << multiply(number, numberOrig, 1) << '\n';
100+
if (not negativePower)
101+
ss << BECAUSE << " " << multiply(result, _number, 1) << '\n';
104102
else
105-
ss << BECAUSE << " " << divide("1", number, 1) << '\n';
106-
if (negative)
103+
ss << BECAUSE << " " << divide("1", result, 1) << '\n';
104+
if (negativePower)
107105
currentPower = "-" + currentPower;
108106

109-
ss << printers::ppSuperscript(numberOrig, currentPower) << " = " << number << '\n';
107+
ss << printers::ppSuperscript(_number, currentPower) << " = " << result << '\n';
110108
}
111109
});
112110

113111
finish:
114-
number = numUtils::standardizeNumber(number);
112+
result = numUtils::standardizeNumber(result);
115113

116-
if (negative)
114+
if (negativePower)
117115
{
118116
if (steps == 2)
119-
ss << BECAUSE << " " << divide("1", number, 1) << '\n';
117+
ss << BECAUSE << " " << divide("1", result, 1) << '\n';
120118
else if (steps == 1)
121119
{
122-
const auto& divisionResult = divide("1", number, 0);
123-
ss << numberOrig << makeSuperscript('-') << makeSuperscript(static_cast<std::string>(raiseTo)) << " = "
120+
const auto& divisionResult = divide("1", result, 0);
121+
ss << _number << makeSuperscript('-') << makeSuperscript(static_cast<std::string>(raiseTo)) << " = "
124122
<< divisionResult;
125123
}
126124
else
127-
ss << number;
125+
ss << result;
128126
}
129127

130128
if (steps >= 1)
131-
ss << numberOrig << makeSuperscript(raiseTo) << " = " << number;
129+
ss << _number << makeSuperscript(raiseTo) << " = " << result;
132130
else if (steps == 0)
133-
ss << number;
131+
ss << result;
134132

135133
loop(multiply(raiseTo, std::to_string(numberTrailingZeros), 0), [&](const auto& _) { ss << "0"; });
136134

src/calc/power/powerReport.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ std::string reportPowerRoot(const std::string& _number,
5353
*
5454
* @param[in] _number The number to raise to.
5555
* @param[in] raiseTo The power of the number.
56-
* @param[in] negative Whether the result should be negative.
56+
* @param[in] negativePower Whether the result should be divided by 1.
5757
* @param[in] steps The steps to show.
5858
*
5959
* @return The formatted power report.
6060
*/
6161
std::string reportPower(const std::string& _number,
6262
const std::string& raiseTo,
6363
size_t numberTrailingZeros,
64-
bool negative,
64+
bool negativePower,
6565
int steps);

src/util.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,27 @@ namespace steppable::__internals::numUtils
285285
number = number.substr(1, number.length() - 1);
286286
return not std::ranges::any_of(number, [](const auto& c) { return c != '0' and c != '.'; });
287287
}
288+
289+
bool isOdd(const std::string& number)
290+
{
291+
if (isDecimal(number))
292+
return false; // Decimals cannot be classified.
293+
if (isZeroString(number))
294+
return false; // Zero is neither even nor odd.
295+
296+
const char lastDigit = number.back();
297+
return (lastDigit - '0') % 2 == 1;
298+
}
299+
300+
bool isEven(const std::string& number)
301+
{
302+
if (isDecimal(number))
303+
return false; // Decimals cannot be classified.
304+
if (isZeroString(number))
305+
return false; // Zero is neither even nor odd.
306+
307+
return not isOdd(number);
308+
}
288309
} // namespace steppable::__internals::numUtils
289310

290311
namespace steppable::__internals::stringUtils

0 commit comments

Comments
 (0)