浏览代码

Fixing bug when performing division with a number of the form '0.*'

Sam Jaffe 7 年之前
父节点
当前提交
479abfad73
共有 2 个文件被更改,包括 7 次插入2 次删除
  1. 6 1
      src/bignum_helper.cpp
  2. 1 1
      test/bigdecimal_test.cpp

+ 6 - 1
src/bignum_helper.cpp

@@ -122,7 +122,12 @@ namespace math { namespace detail {
   }
   
   size_t digits(data_type const & data) {
-    return SEG_DIGITS * (data.size()-1) + digits(data.back());
+    size_t segDig = SEG_DIGITS * (data.size()-1);
+    if (data.back() == 0) {
+      return segDig - SEG_DIGITS + digits(data[data.size()-2]);
+    } else {
+      return segDig + digits(data.back());
+    }
   }
   
   data_type divide(data_type & remainder, data_type const & divisor) {

+ 1 - 1
test/bigdecimal_test.cpp

@@ -128,7 +128,7 @@ INSTANTIATE_TEST_CASE_P(BigDecimal, DivisionScaleTest,
                                         ArithTuple{{1, 1}, {10,  0}, "0.1" },
                                         ArithTuple{{1, 1}, {10, -1}, "0.10"},
                                         ArithTuple{{"1.1"}, {"1.1"}, "1"},
-//                                        ArithTuple{{"0.01"}, {100, -2}, "1"}, // Infinite loop because of leading 0?
+                                        ArithTuple{{"0.01"}, {100, -2}, "0.0001"},
                                         ArithTuple{{1, 5}, {1,  5}, "1"},
                                         ArithTuple{{1, 5}, {1000000000, -9}, "0.00000000100000"},
                                         ArithTuple{{100, -2}, {1000000000, -9}, "0.0000001"},