Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange pow(x, y); behaviour

Tags:

c++

pow

While doing my homework I noticed something really strange that I just can't figure out why.

int x = 5;
cout << pow(x, 2);

The result is 25. That's fine. But if I write the same program like this:

int x = 5;
int y = pow(x, 2);
cout << y;

The result is 24!

When x is 2, 3, 4, 6, 7, 8 no problem, but with 5, 10, 11, 13 etc. result is 1 lower than it should be.

Same thing with if().

for (int x = 1; x <= 20 ; x++) {
    if (x * x == pow(x, 2)) 
    cout << x << endl;
}

It prints out numbers 1, 2, 3, 4, 6, 8, 12, 16.

like image 932
SoapyCro Avatar asked Feb 05 '13 18:02

SoapyCro


3 Answers

std::pow() returns a floating point number. If the result is for instance 24.99999999 and you cast it to int, it will be cut off to 24.

And that is what you do in the 2nd code example.
cout does not convert to int and outputs the correct result in the 1st code example.

like image 142
juergen d Avatar answered Oct 12 '22 23:10

juergen d


'pow' returns a double value, not an int. The double value gets truncated when cast as an int.

http://www.cplusplus.com/reference/cmath/pow/

Comparing double to int is not recommended.

http://www.cplusplus.com/reference/cmath/pow/

Minor edit for your code to work :

int x = 5;
double y = pow(x,2);   // correct datatype
cout << y;
like image 31
DhruvPathak Avatar answered Oct 13 '22 01:10

DhruvPathak


The pow function works with float and double, not integers. When you assign this to an integer, the value may be truncated, as floating point data has precision issues in its representation.

I recommend reading What Every Computer Scientist Should Know About Floating-Point Arithmetic, as this describes why you are seeing this behavior.

That being said, if you work with double values instead of int, you'll likely see the results you are expecting.

like image 22
Reed Copsey Avatar answered Oct 13 '22 01:10

Reed Copsey