Modify

Ticket #8326 (closed Bugs: fixed)

Opened 13 months ago

Last modified 13 months ago

returned value of pow() is wrong if argument-variable is reused to accept.

Reported by: pjtsu Owned by: johnmaddock
Milestone: To Be Determined Component: multiprecision
Version: Boost 1.53.0 Severity: Problem
Keywords: Cc:

Description

If argument-variable is reuse directly, pow(2, 10) returns 1.
Sample code is the following.

#include <iostream>
#include <iomanip>
#include <boost/math/special_functions/beta.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

int main()
{
	typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50> > MY_FLOAT_TYPE;
	const double var1 = 2;
	const double var2 = 10;
	
	// OK (equal to 1024)
	{
		MY_FLOAT_TYPE a = var1;
		MY_FLOAT_TYPE b = var2;
		MY_FLOAT_TYPE c = pow(a, b);
		std::cout << "result1=" << c << std::endl;
		a = c; // reusing variable 'a' indirectly.
		std::cout << "result2=" << a << std::endl;
	}

	// NG (not equal to 1024)
	{
		MY_FLOAT_TYPE a = var1;
		MY_FLOAT_TYPE b = var2;
		a = pow(a, b); // reusing variable 'a' directly.
		std::cout << "result3=" << a << std::endl;
	}
	
	return 0;
}

Output is the following.

result1=1024
result2=1024
result3=1

Incidentally, output of pow(2, 0.5) is the following. Similar problem happened.

result1=1.41421
result2=1.41421
result3=1.18921

I found this problem on Visual Studio 2010 and Linux gcc 4.4.7.
I found similar problem with mpf_float on Linux gcc 4.4.7.

Attachments

Change History

comment:1 Changed 13 months ago by johnmaddock

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

(In [83619]) Fix bug(s) that cause variable reuse in function calls to fail. Add additional test cases. Fixes #8326.

comment:2 Changed 13 months ago by johnmaddock

(In [83669]) Merge fix for #8326, plus misc valgrind errors. Refs #8326.

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.