Modify ↓

Opened 17 months ago

Closed 17 months 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.

### Attachments (0)

**Note:**See TracTickets for help on using tickets.

Fixed in https://github.com/boostorg/multiprecision/commit/4538e88a91b47a72a3e136672d1a7389e9035fd8

Thanks for the report!