#9579 closed Bugs (fixed)
conversion error from boost cpp_rational to int
Reported by: | Owned by: | John Maddock | |
---|---|---|---|
Milestone: | To Be Determined | Component: | multiprecision |
Version: | Boost 1.55.0 | Severity: | Problem |
Keywords: | cpp_rational conversion | Cc: |
Description
boost cpp_rational seems to convert wrong to int when the numerator and denominator have many digits.
#include <iostream> #include <boost/multiprecision/cpp_int.hpp> using namespace boost::multiprecision; using namespace std; int main() { cpp_rational a("4561231231235/123123123123"); std::cout << "bad convert: " << a << ' ' << float(a) << ' ' << int(a) << ' ' << a.convert_to<int>() << endl; a = (cpp_rational)"456/123"; std::cout << "good convert: " << a << ' ' << float(a) << ' ' << int(a) << ' ' << a.convert_to<int>() << endl; }
The output is:
bad convert: 651604461605/17589017589 37.0461 -3 -3 good convert: 152/41 3.70732 3 3
Also, attempts to convert cpp_rational to cpp_int fail to compile, e.g., using
cpp_int b = static_cast<cpp_int> (a); cpp_int b = a.convert_to<cpp_int>();
What I want to happen is to divide and round down and never get it wrong even close to an int.
Help? Thanks.
Change History (5)
comment:1 by , 9 years ago
Component: | rational → multiprecision |
---|---|
Owner: | changed from | to
comment:2 by , 9 years ago
I'm testing a proper fix, but the workaround would be to use:
cpp_int i = numerator(a) / denominator(a);
comment:4 by , 9 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
The fix has gone into Git develop: https://github.com/boostorg/multiprecision/commit/9a05e24994e268035184df35643b690c1c749cdc
Note:
See TracTickets
for help on using tickets.
I think you have selected the wrong component. I am going to change it to multiprecision.