Opened 10 years ago
Closed 10 years ago
#8133 closed Bugs (fixed)
multiprecision, failed gcd tests (test_cpp_int.cpp)
| Reported by: | Owned by: | John Maddock | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | multiprecision |
| Version: | Boost 1.53.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
I modified test_cpp_int.cpp to generate random numbers with a lot of ones or zeros.
I modified T generate_random(unsigned bits_wanted):
...
T val = 0;
for(unsigned i = 0; i < terms_needed; ++i)
{
val *= (gen.max)();
switch (gen() % 5)
{
case 0:
val += gen();
break;
case 1:
val += 1;
break;
case 2:
val += (gen.max)() - 2;
break;
case 3:
val += (gen.max)() - 1;
break;
}
}
val %= max_val;
return (val == 0)? val : 1;
}
This caused some tests related to gcd computation to fail. Here is output (I removed some parts of it with results of operations) - http://pastebin.com/iZdmX1bq
Change History (4)
comment:1 by , 10 years ago
comment:2 by , 10 years ago
Yes, you are right, it should be (val == 0) ? 1 : val;
This line is there because tests will fail with division by zero otherwise.
I'm testing it on 32-bit Windows with GCC 4.7.2 and MSVC 2010. I'm using boost 1.53.0, not the latest trunk. Following program outputs 1 1 1 3 when compiled with GCC and 3 3 1 3 and when complied with MSVC.
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::cpp_int;
using boost::multiprecision::gcd;
int main()
{
cpp_int a("0xffffffee00000095fffffd0000000a8fffffe4e10000348bffffb1a100005ae3ffffade700003955ffffe19900000bd2fffffcdb00000076fffffffffffffffd");
// correct gcd is 1
std::cout << gcd(a, 4294967295) << '\n';
std::cout << gcd(4294967295, a) << '\n';
std::cout << gcd(a, cpp_int("4294967295")) << '\n';
std::cout << gcd(cpp_int("4294967295"), a) << '\n';
return 0;
}
comment:3 by , 10 years ago
Thanks, reproduced.
It's a bug in the subtraction routine for subtracting an unsigned int - wrongly uses a carry when subtracting ~static_cast<unsigned>(0).
Testing a fix now.
comment:4 by , 10 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |

Thanks for the report - However I'm having trouble reproducing here, note that your random generator code above either returns 0 or 1, I assume the last line should read:
?
However, even then neither random numbers generated as above, nor the specific test values printed out in your log trigger errors for me. What compiler/platform is this? I'm testing on Win32 VC10 here, but I can switch to 64-bit Linux if that's the thing I'm missing.
BTW the report you outputted, contains line numbers that don't match up to anything in test_cpp_int.cpp - I guess because you modified that file?