Modify

Ticket #12559 (closed Bugs: fixed)

Opened 6 months ago

Last modified 6 months ago

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

Change History

comment:1 Changed 6 months ago by johnmaddock

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

Add a comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
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.