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.
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.
'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;
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With