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!