# HG changeset patch # User Chris Cannam # Date 1381938254 -3600 # Node ID 0fdbb93e92b7adb0a7e3d5f953b5c64f469f2421 # Parent 5f88f517b637e6c2a9b66ae4b9a380a40014832e Factorial: return double (int not big enough for many popular values) diff -r 5f88f517b637 -r 0fdbb93e92b7 maths/MathUtilities.cpp --- a/maths/MathUtilities.cpp Wed Oct 16 13:29:00 2013 +0100 +++ b/maths/MathUtilities.cpp Wed Oct 16 16:44:14 2013 +0100 @@ -379,11 +379,11 @@ else return n1; } -int +double MathUtilities::factorial(int x) { if (x < 0) return 0; - int f = 1; + double f = 1; for (int i = 1; i <= x; ++i) { f = f * i; } diff -r 5f88f517b637 -r 0fdbb93e92b7 maths/MathUtilities.h --- a/maths/MathUtilities.h Wed Oct 16 13:29:00 2013 +0100 +++ b/maths/MathUtilities.h Wed Oct 16 16:44:14 2013 +0100 @@ -65,7 +65,7 @@ static int previousPowerOfTwo(int x); // e.g. 1300 -> 1024, 2048 -> 2048 static int nearestPowerOfTwo(int x); // e.g. 1300 -> 1024, 12 -> 16 (not 8) - static int factorial(int x); + static double factorial(int x); // returns double in case it is large static int gcd(int a, int b); }; diff -r 5f88f517b637 -r 0fdbb93e92b7 tests/TestMathUtilities.cpp --- a/tests/TestMathUtilities.cpp Wed Oct 16 13:29:00 2013 +0100 +++ b/tests/TestMathUtilities.cpp Wed Oct 16 16:44:14 2013 +0100 @@ -125,12 +125,15 @@ BOOST_AUTO_TEST_CASE(factorial) { - BOOST_CHECK_EQUAL(MathUtilities::factorial(-10), 0); - BOOST_CHECK_EQUAL(MathUtilities::factorial(0), 1); - BOOST_CHECK_EQUAL(MathUtilities::factorial(1), 1); - BOOST_CHECK_EQUAL(MathUtilities::factorial(2), 2); - BOOST_CHECK_EQUAL(MathUtilities::factorial(3), 6); - BOOST_CHECK_EQUAL(MathUtilities::factorial(4), 24); + BOOST_CHECK_EQUAL(MathUtilities::factorial(-10), 0.0); + BOOST_CHECK_EQUAL(MathUtilities::factorial(0), 1.0); + BOOST_CHECK_EQUAL(MathUtilities::factorial(1), 1.0); + BOOST_CHECK_EQUAL(MathUtilities::factorial(2), 2.0); + BOOST_CHECK_EQUAL(MathUtilities::factorial(3), 6.0); + BOOST_CHECK_EQUAL(MathUtilities::factorial(4), 24.0); + + // Too big for an int, hence double return value from factorial + BOOST_CHECK_EQUAL(MathUtilities::factorial(20), 2432902008176640000.0); } BOOST_AUTO_TEST_CASE(gcd)