Throw an InternalError when trying to divide (or modulo) by zero in MathLib.
This commit is contained in:
parent
20f989b6c4
commit
0c812c5ac3
|
@ -235,7 +235,10 @@ std::string MathLib::subtract(const std::string &first, const std::string &secon
|
||||||
std::string MathLib::divide(const std::string &first, const std::string &second)
|
std::string MathLib::divide(const std::string &first, const std::string &second)
|
||||||
{
|
{
|
||||||
if (MathLib::isInt(first) && MathLib::isInt(second)) {
|
if (MathLib::isInt(first) && MathLib::isInt(second)) {
|
||||||
return toString<bigint>(toLongNumber(first) / toLongNumber(second));
|
bigint b = toLongNumber(second);
|
||||||
|
if (b == 0)
|
||||||
|
throw InternalError(0, "Internal Error: Division by zero");
|
||||||
|
return toString<bigint>(toLongNumber(first) / b);
|
||||||
}
|
}
|
||||||
return toString<double>(toDoubleNumber(first) / toDoubleNumber(second));
|
return toString<double>(toDoubleNumber(first) / toDoubleNumber(second));
|
||||||
}
|
}
|
||||||
|
@ -251,7 +254,10 @@ std::string MathLib::multiply(const std::string &first, const std::string &secon
|
||||||
std::string MathLib::mod(const std::string &first, const std::string &second)
|
std::string MathLib::mod(const std::string &first, const std::string &second)
|
||||||
{
|
{
|
||||||
if (MathLib::isInt(first) && MathLib::isInt(second)) {
|
if (MathLib::isInt(first) && MathLib::isInt(second)) {
|
||||||
return toString<MathLib::bigint>(toLongNumber(first) % toLongNumber(second));
|
bigint b = toLongNumber(second);
|
||||||
|
if (b == 0)
|
||||||
|
throw InternalError(0, "Internal Error: Division by zero");
|
||||||
|
return toString<MathLib::bigint>(toLongNumber(first) % b);
|
||||||
}
|
}
|
||||||
return toString<double>(fmod(toDoubleNumber(first),toDoubleNumber(second)));
|
return toString<double>(fmod(toDoubleNumber(first),toDoubleNumber(second)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@ private:
|
||||||
ASSERT_EQUALS("0" , MathLib::subtract("0", "0."));
|
ASSERT_EQUALS("0" , MathLib::subtract("0", "0."));
|
||||||
ASSERT_EQUALS("0.99999999" , MathLib::subtract("1", "0.00000001")); // #4016
|
ASSERT_EQUALS("0.99999999" , MathLib::subtract("1", "0.00000001")); // #4016
|
||||||
ASSERT_EQUALS("30666.22" , MathLib::subtract("30666.22", "0.0")); // #4068
|
ASSERT_EQUALS("30666.22" , MathLib::subtract("30666.22", "0.0")); // #4068
|
||||||
|
ASSERT_EQUALS("0.0" , MathLib::subtract("0.0", "0.0"));
|
||||||
|
|
||||||
// multiply
|
// multiply
|
||||||
ASSERT_EQUALS("-0.003" , MathLib::multiply("-1e-3", "3"));
|
ASSERT_EQUALS("-0.003" , MathLib::multiply("-1e-3", "3"));
|
||||||
|
@ -123,20 +124,23 @@ private:
|
||||||
ASSERT_EQUALS("5" , MathLib::divide("25.5", "5.1"));
|
ASSERT_EQUALS("5" , MathLib::divide("25.5", "5.1"));
|
||||||
ASSERT_EQUALS("7" , MathLib::divide("21.", "3"));
|
ASSERT_EQUALS("7" , MathLib::divide("21.", "3"));
|
||||||
ASSERT_EQUALS("1" , MathLib::divide("3", "2"));
|
ASSERT_EQUALS("1" , MathLib::divide("3", "2"));
|
||||||
ASSERT_EQUALS("0.0" , MathLib::subtract("0.0", "0.0"));
|
ASSERT_THROW(MathLib::divide("123", "0"), InternalError); // throw
|
||||||
|
MathLib::divide("123", "0.0"); // don't throw
|
||||||
|
|
||||||
// Unknown action should throw exception
|
// Unknown action should throw exception
|
||||||
ASSERT_THROW(MathLib::calculate("1","2",'j'),InternalError);
|
ASSERT_THROW(MathLib::calculate("1","2",'j'),InternalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
void calculate1() const { // mod
|
void calculate1() const { // mod
|
||||||
ASSERT_EQUALS("0" , MathLib::calculate("2" , "1" , '%'));
|
ASSERT_EQUALS("0" , MathLib::calculate("2" , "1" , '%'));
|
||||||
ASSERT_EQUALS("0" , MathLib::calculate("2.0" , "1.0" , '%'));
|
ASSERT_EQUALS("0" , MathLib::calculate("2.0" , "1.0" , '%'));
|
||||||
ASSERT_EQUALS("2" , MathLib::calculate("12" , "5" , '%'));
|
ASSERT_EQUALS("2" , MathLib::calculate("12" , "5" , '%'));
|
||||||
ASSERT_EQUALS("1" , MathLib::calculate("100" , "3" , '%'));
|
ASSERT_EQUALS("1" , MathLib::calculate("100" , "3" , '%'));
|
||||||
ASSERT_EQUALS("12" , MathLib::calculate("12.0" , "13.0" , '%'));
|
ASSERT_EQUALS("12" , MathLib::calculate("12.0" , "13.0" , '%'));
|
||||||
ASSERT_EQUALS("1.3" , MathLib::calculate("5.3" , "2.0" , '%'));
|
ASSERT_EQUALS("1.3" , MathLib::calculate("5.3" , "2.0" , '%'));
|
||||||
ASSERT_EQUALS("1.7" , MathLib::calculate("18.5" , "4.2" , '%'));
|
ASSERT_EQUALS("1.7" , MathLib::calculate("18.5" , "4.2" , '%'));
|
||||||
|
ASSERT_THROW(MathLib::calculate("123", "0", '%'), InternalError); // throw
|
||||||
|
MathLib::calculate("123", "0.0", '%'); // don't throw
|
||||||
}
|
}
|
||||||
|
|
||||||
void convert() const {
|
void convert() const {
|
||||||
|
|
Loading…
Reference in New Issue