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. W.