Hi,
On x86 the following code intended to calculate log2(4096) gives an
unexpected result of 11 when the value is cast directly to an int. If
the result is stored in a double and then cast to an int the expected
value (12) is given.
double r0;
double d_msb;
int i_msb;
r0=4096;
i_msb = (int)(log10(r0)/log10(2));
printf("%d\n",i_msb);
d_msb = (log10(r0)/log10(2));
i_msb = (int)d_msb;
printf("%d\n",i_msb);
# uname -srm
Linux 2.4.9-34smp i686
# g++ -o log log.c
# ./log
11
12
I have tried several versions of gcc on x86 and all give the same
behaviour. (3.0, 3.0.1, 3.0.4, 3.2, 3.2.2, 3.3.1)
On Solaris 8 this code gives the expected output (12 12). AMD64 with
-m64 gives the expected results but with -m32 the results differ (11
12).
Why do the two values differ? If it is the case that a
rounding/precision error is causing an off by one result, should it
not be consistent between the two forms of the code?
Thanks,
Andrew