The following code should return the base2 logarithm of 64 (ie 6)
double d = log(64.0) / log(2.0);
int i = (int)d;
cout << i;
And indeed it does output "6". However, if you attempt to cast it on the same line, then it returns 5.
int i2 = (int)( log(64.0) / log(2.0) );
int i3 = static_cast<int>( log(64.0) / log(2.0) );
cout << i2 << i3;
This outputs "55" instead of the expected "66". Visual Studio 2003 outputs "66".
gcc 4.1.0, Suse Linux 10.1.
This comes from precission of the floating point.
*** This bug has been marked as a duplicate of 323 ***
To be more concrete: (int)(expression) rounds down. So if your quotient
of logarithms happens to be computed to 5.999999999999999, then you
will get a result of 5 after casting to int. You should round results,
not just cast them.