From 6f31ce334d9dec52a71cae4008c897eaa05800f9 Mon Sep 17 00:00:00 2001 From: amai2012 Date: Sat, 31 May 2014 18:25:23 +0200 Subject: [PATCH] #5875 Fix 'lib/mathlib.cpp:559:43: runtime error: division by zero'. Several fixes to MathLib::divide(): avoid division by zero, handle various representation of 0 value, use 'nan.' instead of '-nan.0' --- lib/mathlib.cpp | 10 +++++----- test/testmathlib.cpp | 10 ++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/mathlib.cpp b/lib/mathlib.cpp index df4d160d2..e68ea3180 100644 --- a/lib/mathlib.cpp +++ b/lib/mathlib.cpp @@ -549,12 +549,12 @@ std::string MathLib::divide(const std::string &first, const std::string &second) if (b == 0) throw InternalError(0, "Internal Error: Division by zero"); return toString(toLongNumber(first) / b); - } else if (second == "0.0") { - if (first=="0.0" || first=="+0.0") + } else if (isNullValue(second)) { + if (isNullValue(first)) return "nan.0"; - if (first=="-0.0") - return "-nan.0"; - return (first[0] == '-') ? "-inf.0" : "inf.0"; + const int sign_first = (isPositive(first)) ? 1 : -1; + const int sign_second = (isPositive(second)) ? 1 : -1; + return (sign_first*sign_second == 1) ? "inf.0" : "-inf.0"; } return toString(toDoubleNumber(first) / toDoubleNumber(second)); } diff --git a/test/testmathlib.cpp b/test/testmathlib.cpp index b2410363c..83a3e38d4 100644 --- a/test/testmathlib.cpp +++ b/test/testmathlib.cpp @@ -599,8 +599,18 @@ private: void naninf() const { ASSERT_EQUALS("nan.0", MathLib::divide("0.0", "0.0")); // nan + ASSERT_EQUALS("nan.0", MathLib::divide("0.0", "0.f")); // nan (#5875) + ASSERT_EQUALS("nan.0", MathLib::divide("-0.0", "0.f")); // nan (#5875) + ASSERT_EQUALS("nan.0", MathLib::divide("-0.f", "0.f")); // nan (#5875) + ASSERT_EQUALS("nan.0", MathLib::divide("-0.0", "-0.f")); // nan (#5875) + ASSERT_EQUALS("nan.0", MathLib::divide("-.0", "-0.f")); // nan (#5875) + ASSERT_EQUALS("nan.0", MathLib::divide("0.0", "-0.f")); // nan (#5875) + ASSERT_EQUALS("nan.0", MathLib::divide("0.f", "-0.f")); // nan (#5875) ASSERT_EQUALS("inf.0", MathLib::divide("3.0", "0.0")); // inf + ASSERT_EQUALS("inf.0", MathLib::divide("3.0", "0.f")); // inf (#5875) ASSERT_EQUALS("-inf.0", MathLib::divide("-3.0", "0.0")); // -inf (#5142) + ASSERT_EQUALS("-inf.0", MathLib::divide("-3.0", "0.0f")); // -inf (#5142) + ASSERT_EQUALS("inf.0", MathLib::divide("-3.0", "-0.0f")); // inf (#5142) } void isNullValue() const {