From dab9b5cd2106c0a7362ca39f28c508c4832eb4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 14 Aug 2018 13:21:13 +0200 Subject: [PATCH] [poincare] Fix and add tests on Integer::Division --- poincare/include/poincare/integer.h | 1 + poincare/include/poincare/tree_pool.h | 2 +- poincare/src/integer.cpp | 4 +-- poincare/test/integer.cpp | 49 +++++++++++++++------------ 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/poincare/include/poincare/integer.h b/poincare/include/poincare/integer.h index e43c39683..49d810504 100644 --- a/poincare/include/poincare/integer.h +++ b/poincare/include/poincare/integer.h @@ -73,6 +73,7 @@ private: static Integer IntegerWithHalfDigitAtIndex(half_native_uint_t halfDigit, int index); uint16_t numberOfHalfDigits() const { + if (m_numberOfDigits == 0) { return 0; } native_uint_t d = digit(m_numberOfDigits-1); native_uint_t halfBase = 1 << (8*sizeof(half_native_uint_t)); return (d >= halfBase ? 2*m_numberOfDigits : 2*m_numberOfDigits-1); diff --git a/poincare/include/poincare/tree_pool.h b/poincare/include/poincare/tree_pool.h index 4cf1427b3..e32b9f0dc 100644 --- a/poincare/include/poincare/tree_pool.h +++ b/poincare/include/poincare/tree_pool.h @@ -116,7 +116,7 @@ public: } private: - constexpr static int BufferSize = 1024;//2048; + constexpr static int BufferSize = 2048; constexpr static int MaxNumberOfNodes = BufferSize/sizeof(TreeNode); constexpr static int MaxNumberOfStaticNodes = 200; // TODO: count how may are needed diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index d7e4acec4..2e0ed5784 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -277,8 +277,8 @@ IntegerDivision NaturalIntegerAbstract::udiv(const NaturalIntegerAbstract * nume int n = B.node()->numberOfHalfDigits(); int m = A.node()->numberOfHalfDigits()-n; - half_native_uint_t qDigits[k_maxNumberOfDigits+1]; - memset(qDigits, 0, (m/2+1)*sizeof(native_uint_t)); + half_native_uint_t qDigits[2*k_maxNumberOfDigits]; // qDigits is a half_native_uint_t array + memset(qDigits, 0, 2*k_maxNumberOfDigits*sizeof(half_native_uint_t)); Integer betam = IntegerWithHalfDigitAtIndex(1, m+1); Integer betaMB = Integer::Multiplication(betam, B); // TODO: can swift all digits by m! B.swift16(mg) if (Integer::NaturalOrder(A,betaMB) > 0) { diff --git a/poincare/test/integer.cpp b/poincare/test/integer.cpp index 05f205e44..1f006e3c0 100644 --- a/poincare/test/integer.cpp +++ b/poincare/test/integer.cpp @@ -134,31 +134,36 @@ QUIZ_CASE(poincare_integer_multiplication) { assert_mult_to(Integer("9999999999"), Integer("9999999999"), Integer("99999999980000000001")); assert_mult_to(Integer("-23"), Integer("0"), Integer("0")); assert_mult_to(Integer("-23456787654567765456"), Integer("0"), Integer("0")); + assert_mult_to(Integer("3293920983030066"), Integer(720), Integer("2371623107781647520")); + assert_mult_to(Integer("389282362616"), Integer(720), Integer("280283301083520")); +} + +static inline void assert_div_to(const Integer i, const Integer j, const Integer q, const Integer r) { + assert(Integer::NaturalOrder(Integer::Division(i, j).quotient, q) == 0); + assert(Integer::NaturalOrder(Integer::Division(i, j).remainder, r) == 0); } QUIZ_CASE(poincare_integer_divide) { -#if 0 - assert(Integer::Division(Integer(8), Integer(4)).quotient.isEqualTo(Integer(2)) && Integer::Division(Integer(8), Integer(4)).remainder.isEqualTo(Integer(0))); - assert(Integer::Division(Integer("3293920983030066"), Integer(38928)).quotient.isEqualTo(Integer("84615726033")) && Integer::Division(Integer("3293920983030066"), Integer(38928)).remainder.isEqualTo(Integer(17442))); - assert(Integer::Division(Integer("3293920983030066"), Integer("389282362616")).quotient.isEqualTo(Integer(8461)) && Integer::Division(Integer("3293920983030066"), Integer("389282362616")).remainder.isEqualTo(Integer("202912936090"))); - assert(Integer::Division(Integer("-18940566"), Integer("499030")).quotient.isEqualTo(Integer(-38)) && Integer::Division(Integer("-18940566"), Integer("499030")).remainder.isEqualTo(Integer("22574"))); - assert(Integer::Division(Integer("234567909876"), Integer("-234567898")).quotient.isEqualTo(Integer(-1000)) && Integer::Division(Integer("234567909876"), Integer("-234567898")).remainder.isEqualTo(Integer("11876"))); - assert(Integer::Division(Integer("-567"), Integer("-12")).quotient.isEqualTo(Integer(48)) && Integer::Division(Integer("-567"), Integer("-12")).remainder.isEqualTo(Integer("9"))); - assert(Integer::Division(Integer("-576"), Integer("-12")).quotient.isEqualTo(Integer(48)) && Integer::Division(Integer("-576"), Integer("-12")).remainder.isEqualTo(Integer("0"))); - assert(Integer::Division(Integer("576"), Integer("-12")).quotient.isEqualTo(Integer(-48)) && Integer::Division(Integer("576"), Integer("-12")).remainder.isEqualTo(Integer("0"))); - assert(Integer::Division(Integer("-576"), Integer("12")).quotient.isEqualTo(Integer(-48)) && Integer::Division(Integer("-576"), Integer("12")).remainder.isEqualTo(Integer("0"))); - assert(Integer::Division(Integer("12345678910111213141516171819202122232425"), Integer("10")).remainder.isEqualTo(Integer("5"))); - assert(Integer::Division(Integer("12345678910111213141516171819202122232425"), Integer("10")).quotient.isEqualTo(Integer("1234567891011121314151617181920212223242"))); - assert(Integer::Division(Integer("1234567891011121314151617181920212223242"), Integer("10")).quotient.isEqualTo(Integer("123456789101112131415161718192021222324")) && Integer::Division(Integer("1234567891011121314151617181920212223242"), Integer("10")).remainder.isEqualTo(Integer("2"))); - assert(Integer::Division(Integer("123456789101112131415161718192021222324"), Integer("10")).quotient.isEqualTo(Integer("12345678910111213141516171819202122232")) && Integer::Division(Integer("123456789101112131415161718192021222324"), Integer("10")).remainder.isEqualTo(Integer("4"))); - assert(Integer::Division(Integer("12345678910111213141516171819202122232"), Integer("10")).quotient.isEqualTo(Integer("1234567891011121314151617181920212223")) && Integer::Division(Integer("12345678910111213141516171819202122232"), Integer("10")).remainder.isEqualTo(Integer("2"))); - assert(Integer::Division(Integer("1234567891011121314151617181920212223"), Integer("10")).quotient.isEqualTo(Integer("123456789101112131415161718192021222")) && Integer::Division(Integer("1234567891011121314151617181920212223"), Integer("10")).remainder.isEqualTo(Integer("3"))); - assert(Integer::Division(Integer("123456789101112131415161718192021222"), Integer("10")).quotient.isEqualTo(Integer("12345678910111213141516171819202122")) && Integer::Division(Integer("123456789101112131415161718192021222"), Integer("10")).remainder.isEqualTo(Integer("2"))); - assert(Integer::Division(Integer("12345678910111213141516171819202122"), Integer("10")).quotient.isEqualTo(Integer("1234567891011121314151617181920212")) && Integer::Division(Integer("12345678910111213141516171819202122"), Integer("10")).remainder.isEqualTo(Integer("2"))); - assert(Integer::Division(Integer("0"), Integer("-10")).quotient.isEqualTo(Integer("0")) && Integer::Division(Integer("0"), Integer("-10")).remainder.isEqualTo(Integer("0"))); - assert(Integer::Division(Integer("0"), Integer("-123456789098760")).quotient.isEqualTo(Integer("0")) && Integer::Division(Integer("0"), Integer("-123456789098760")).remainder.isEqualTo(Integer("0"))); - assert(Integer::Division(Integer("2305843009213693952"), Integer("2305843009213693921")).quotient.isEqualTo(Integer("1")) && Integer::Division(Integer("2305843009213693952"), Integer("2305843009213693921")).remainder.isEqualTo(Integer("31"))); -#endif + assert_div_to(Integer("146097313984800"), Integer(720), Integer("202912936090"), Integer(0)); + assert_div_to(Integer(8), Integer(4), Integer(2), Integer(0)); + assert_div_to(Integer("3293920983030066"), Integer(38928), Integer("84615726033"), Integer(17442)); + assert_div_to(Integer("3293920983030066"), Integer("389282362616"), Integer(8461), Integer("202912936090")); + assert_div_to(Integer("-18940566"), Integer("499030"), Integer(-38), Integer("22574")); + assert_div_to(Integer("234567909876"), Integer("-234567898"), Integer(-1000), Integer("11876")); + assert_div_to(Integer("-567"), Integer("-12"), Integer(48), Integer("9")); + assert_div_to(Integer("-576"), Integer("-12"), Integer(48), Integer("0")); + assert_div_to(Integer("576"), Integer("-12"), Integer(-48), Integer("0")); + assert_div_to(Integer("-576"), Integer("12"), Integer(-48), Integer("0")); + assert_div_to(Integer("12345678910111213141516171819202122232425"), Integer("10"), Integer("1234567891011121314151617181920212223242"), Integer("5")); + assert_div_to(Integer("1234567891011121314151617181920212223242"), Integer("10"), Integer("123456789101112131415161718192021222324"), Integer("2")); + assert_div_to(Integer("123456789101112131415161718192021222324"), Integer("10"), Integer("12345678910111213141516171819202122232"), Integer("4")); + assert_div_to(Integer("12345678910111213141516171819202122232"), Integer("10"), Integer("1234567891011121314151617181920212223"), Integer("2")); + assert_div_to(Integer("1234567891011121314151617181920212223"), Integer("10"), Integer("123456789101112131415161718192021222"), Integer("3")); + assert_div_to(Integer("123456789101112131415161718192021222"), Integer("10"), Integer("12345678910111213141516171819202122"), Integer("2")); + assert_div_to(Integer("12345678910111213141516171819202122"), Integer("10"), Integer("1234567891011121314151617181920212"), Integer("2")); + assert_div_to(Integer("0"), Integer("-10"), Integer("0"), Integer("0")); + assert_div_to(Integer("0"), Integer("-123456789098760"), Integer("0"), Integer("0")); + assert_div_to(Integer("2305843009213693952"), Integer("2305843009213693921"), Integer("1"), Integer("31")); } #if 0