Modify

Opened 8 months ago

Closed 8 months ago

#12559 closed Bugs (fixed)

sqrt for cpp_int_backend behaves incorrect for small argument values

Reported by: Rüdiger Brünner <rbruenner@…> Owned by: johnmaddock
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)

Change History (1)

comment:1 Changed 8 months ago by johnmaddock

  • Resolution set to fixed
  • Status changed from new to closed

Add Comment

Modify Ticket

Change Properties
Set your email in Preferences
Action
as closed The owner will remain johnmaddock.
The resolution will be deleted. Next status will be 'reopened'.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.