Opened 6 years ago
Closed 6 years ago
#12559 closed Bugs (fixed)
sqrt for cpp_int_backend behaves incorrect for small argument values
| Reported by: | Owned by: | John Maddock | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | multiprecision |
| Version: | Boost 1.62.0 | Severity: | Problem |
| Keywords: | multiprecision integer sqrt | Cc: |
Description
The sqrt function for multiprecision integers does not work for small values. Using this code:
checked_int128_t int1;
for (int i = 10; i >= 0; i--)
{
int1 = i;
try
{
int1 = sqrt(int1);
std::cout << "sqrt(" << i << ") = " << int1 << std::endl;
}
catch (std::exception& ex)
{
std::cout << "sqrt(" << i << ") -> " << typeid(ex).name() << ": " << ex.what() << std::endl;
}
}
I get the following output:
sqrt(10) = 3 sqrt(9) = 3 sqrt(8) = 2 sqrt(7) = 2 sqrt(6) = 2 sqrt(5) = 2 sqrt(4) = 2 sqrt(3) -> class boost::exception_detail::clone_impl<struct boost::exception_detail::error_info_injector<class std::overflow_error> >: Unable to allocate sufficient storage for the value of the result: value overflows the maximum allowable magnitude. sqrt(2) -> class boost::exception_detail::clone_impl<struct boost::exception_detail::error_info_injector<class std::overflow_error> >: Unable to allocate sufficient storage for the value of the result: value overflows the maximum allowable magnitude. sqrt(1) = 0 sqrt(0) = 0
While sqrt(3) and sqrt(2) are raising an exception, sqrt(1) gives a wrong result.
Note:
See TracTickets
for help on using tickets.

Fixed in https://github.com/boostorg/multiprecision/commit/4538e88a91b47a72a3e136672d1a7389e9035fd8
Thanks for the report!